PHP Conference Japan 2024

XMLReader::read

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::read移动到文档中的下一个节点

描述

public XMLReader::read(): bool

将光标移动到文档中的下一个节点。

参数

此函数没有参数。

返回值

成功时返回 true,失败时返回 false

参见

添加注释

用户贡献的注释 5 个注释

jirka at kosek dot cz
18 年前
libxml2 包含更实用的方法 readString(),它将读取并返回元素的整个文本内容。您可以在收到开始标签 (XMLReader::ELEMENT) 后调用它。您可以使用此 PHP 代码来模拟此方法,直到 PHP 直接调用底层 libxml2 实现。

<?php
class XMLReader2 extends XMLReader
{
function
readString()
{
$depth = 1;
$text = "";

while (
$this->read() && $depth != 0)
{
if (
in_array($this->nodeType, array(XMLReader::TEXT, XMLReader::CDATA, XMLReader::WHITESPACE, XMLReader::SIGNIFICANT_WHITESPACE)))
$text .= $this->value;
if (
$this->nodeType == XMLReader::ELEMENT) $depth++;
if (
$this->nodeType == XMLReader::END_ELEMENT) $depth--;
}
return
$text;
}
}
?>

只需使用 XMLReader2 而不是 XMLReader。
Nate
13 年前
值得注意的是,此函数也会在结束标签处停止。我有一个类似于以下内容的 XML 文档

<root>
<columns>
<column>columnX</column>
<column>columnY</column>
</columns>
<table>
<row>
<columnX>38</columnX>
<columnY>50</columnY>
</row>
<row>
<columnX>82</columnY>
<columnY>28</columnY>
</row>
...
</table>
</root>

我需要解析 <columns> 对象以了解要检查每个 <row> 节点的哪些属性。因此,我执行了以下操作

<?php
while ($xml->read()) {
if (
$xml->name === 'column') {
//将列节点解析到 $columns 数组中
}
elseif (
$xml->name === 'row') {
//解析行节点,使用构造的 $columns 数组
}
}
?>

这在某种程度上有效,因为我最终得到了一个包含所有我想要的数据的数组,但我的数组大小是预期的两倍,并且每隔一个条目都是空的。花了我一段时间才调试出来,但最终发现检查 <?php $xml->name === 'row' ?> 匹配 <row> 和 </row>,因此检查实际上应该更像是

<?php

if ($xml->name === 'row' && $xml->nodeType == XMLReader::ELEMENT) {
// 解析行节点
}

?>

我想使用 next() 函数,但由于我需要解析两个不同的子树,因此我无法弄清楚如何找到所有列、重置指针,然后找到所有行。
peter at 3xe dot co dot uk
8 年前
另一种解决“也读取结束标签”问题的方法

<?php
$reader
= new XMLReader();
$reader->open('users.xml');

while (
$reader->read()) {
if (
$reader->nodeType == XMLReader::END_ELEMENT) {
continue;
//跳过本次迭代中的其余代码
}
//对所需的节点类型执行某些操作
if($reader->name == 'user') {
//...
}
}
?>
ecziegler at gmail
10 年前
如果您像我一样,一直在颠倒互联网寻找此问题的解决方案
PHP Warning: XMLReader::read(): /tmp/xml_feed.xml:4183934: parser error : Input is not proper UTF-8, indicate encoding !

出于某种原因,此警告会中断执行 - 它是否伪装成致命错误?

经过几天的沮丧,我找到了它!!!!
tidy -xml -o output.xml -utf8 -f error.log input.xml

您可以使用 exec 调用 tidy,它需要几秒钟才能转换 250MB 的提要,但值得花费时间。

在我的案例中,问题出在 latin1 字符集上,出于某种原因,我不得不将 xml 通过 tidy 处理两次 - 第一次处理会创建新的错误,第二次处理则修复所有问题。

我知道无效的 xml 应该由 xml 创建者修复,但在现实世界中,情况并非如此。
匿名
9 年前
> 我本希望使用 next() 函数,但由于我需要解析两个不同的子树,我无法弄清楚如何找到所有列,重置指针,然后找到所有行。

我只是使用

$reader->close();
$reader->open($url);

来重置指针。
To Top