XMLReader::next

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

XMLReader::next将光标移动到下一个节点,跳过所有子树

描述

public XMLReader::next(?string $name = null): bool

将光标定位到下一个节点,跳过所有子树。如果不存在这样的节点,则光标将移动到文档的末尾。

参数

name

要移动到的下一个节点的名称。

返回值

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

变更日志

版本 描述
8.0.0 name 现在可以为空。

参见

添加注释

用户贡献的注释 3 notes

5
ppp dot BOTSNEEDNOTAPPLY at salesfloor dot net
8 年前
此方法似乎遵循以下规则

- 如果 $localName 命名一个兄弟节点,则光标将移动到该节点;
- 如果 $localName 命名一个祖先节点,则光标将移动到该节点的末尾;
- 如果 $localName 命名一个节点,该节点是当前节点的任何祖先的兄弟节点,则光标将移动到该节点;
- 否则光标将移动到文档外部。

特别注意,此方法永远不会将光标移动到子节点。

例如,给定此 XML 文档

<?xml version="1.0" encoding="UTF-8"?>
<root id="root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<aaa id="1">
<bbb id="1.1"></bbb>
<bbb id="1.2"></bbb>
</aaa>
<ccc id="2" />
<aaa id="3">
<ddd id="3.1">
<aaa id="3.1.1"></aaa>
</ddd>
<aaa id="3.2"></aaa>
</aaa>
<aaa id="4">
<eee id="4.1"></eee>
</aaa>
</root>

从 <root id="root"> 到 "bbb" 会将光标置于文档外部;
从 <aaa id="1"> 到 "bbb" 会将光标置于文档外部;
从 <aaa id="1"> 到 "aaa" 会将光标置于 <aaa id="3"> 上;
从 <bbb id="1.1"> 到 "bbb" 会将光标置于 <bbb id="1.2"> 上;
从 <bbb id="1.2"> 到 "bbb" 会将光标置于文档外部;
从 <bbb id="1.1"> 到 "ddd" 会将光标置于文档外部;
从 <bbb id="1.1"> 到 "aaa" 会将光标置于 </aaa> 上;
从 <bbb id="1.1"> 到 "ccc" 会将光标置于 <ccc id="2"> 上;
从 <bbb id="1.1"> 到 "nonsuch" 会将光标置于文档外部;
从 <bbb id="1.1"> 到 "root" 会将光标置于 </root> 上;
从 <ddd id="3.1"> 到 "aaa" 会将光标置于 <aaa id="3.2"> 上;
从 <ddd id="3.1"> 到 "eee" 会将光标置于文档外部;

自己试试

<?php

$document
= <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root id="root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<aaa id="1">
<bbb id="1.1"></bbb>
<bbb id="1.2"></bbb>
</aaa>
<ccc id="2" />
<aaa id="3">
<ddd id="3.1">
<aaa id="3.1.1"></aaa>
</ddd>
<aaa id="3.2"></aaa>
</aaa>
<aaa id="4">
<eee id="4.1"></eee>
</aaa>
</root>
XML;

$filename = "/tmp/xmlreader.php.xml";
file_put_contents($filename, $document);

echo
"给定此 XML 文档\n\n$document\n\n";

showNext("root", "bbb");
showNext("1", "bbb");
showNext("1", "aaa");
showNext("1.1", "bbb");
showNext("1.2", "bbb");
showNext("1.1", "ddd");
showNext("1.1", "aaa");
showNext("1.1", "ccc");
showNext("1.1", "nonsuch");
showNext("1.1", "root");
showNext("3.1", "aaa");
showNext("3.1", "eee");

function
showNext($from, $to) {
global
$filename;

$xml = new \XmlReader();
$xml->open("file://$filename");
while (
$xml->read()) {
if (
$xml->nodeType === \XmlReader::ELEMENT) {
if (
$xml->getAttribute("id") == $from) {
echo
"从 <$xml->name id=\"$from\">";
break;
}
}
}

$xml->next($to);
$destination = "";
if(
$xml->nodeType === \XmlReader::NONE) {
if(!
$xml->read()) {
$destination = "文档之外";
}
}

if(!
$destination) {
if (
$xml->nodeType === \XmlReader::END_ELEMENT) {
$destination = "在 </$xml->name>";
} else if (
$xml->nodeType === \XmlReader::ELEMENT) {
$destination = "在 <$xml->name id=\"" . $xml->getAttribute("id") . "\">";
}
}

echo
" 到 \"$to\" 将光标定位在 $destination;\n";

$xml->close();
}
?>
2
Quiet Noise
5 年前
没有参数的 next() 将带您到与当前光标深度相同的深度的下一个同级节点。
示例
1. 如果你在一个打开的 ELEMENT 节点上,next() 将带你到该元素的结束标签旁边的换行节点(即,如果你在单独的行上放置每个标签),或者它将带你到同一深度上的下一个节点的开始标签。
2. 如果你在 TEXT 节点上,next() 将带你到它旁边的开始标签(如果有)。

如果给定深度上没有更多节点,next() 将带你到包含父节点的结束标签 (END_ELEMENT)。
-1
gholson19 at gmail dot com
9 年前
要跳过从 Word 文档中提取的 XML 中的删除节点,请执行以下操作

if ($paragraph->nodeType == XMLREADER::ELEMENT && $paragraph->name === 'w:del'){$paragraph->next();}
To Top