此方法似乎遵循以下规则
- 如果 $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();
}
?>