XMLReader::read

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

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

描述

public XMLReader::read(): bool

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

参数

此函数没有参数。

返回值

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

参见

添加笔记

用户贡献的笔记 6 笔记

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

<?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
7 年前
另一种处理“也读取闭合标签”问题的方法

<?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 警告:XMLReader::read(): /tmp/xml_feed.xml:4183934: 解析器错误:输入不是正确的 UTF-8,请指定编码!

由于某种原因,此警告会中断执行 - 它是否是一个隐藏的致命错误?

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

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

在我的情况下,问题出在 latin1 字符集上,由于某种原因,我不得不两次通过 tidy 传递 xml - 第一次创建新的错误,第二次修复所有问题。

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

我只是使用

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

来重置指针。
andy at siliconrockstar dot com
13 年前
当您想要跳过一些节点时,避免多次键入 $reader->read() 的一种非常简单的方法

<?php
class smartXMLReader extends XMLReader {
public function
readTimes($count) {
$i = 0;
while(
$i < $count){
$this->read();
$i++;
}
}
}
?>

使用此 smartXMLReader,

<?php
$reader
->readTimes(3);
?>

等同于

<?php
$reader
->read();
$reader->read();
$reader->read();
?>

让您在 XML 文档中移动变得更加轻松 :)
To Top