此方法似乎遵循以下規則
- 如果 $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 "given this XML document\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 "going from <$xml->name id=\"$from\">";
break;
}
}
}
$xml->next($to);
$destination = "";
if($xml->nodeType === \XmlReader::NONE) {
if(!$xml->read()) {
$destination = "outside the document";
}
}
if(!$destination) {
if ($xml->nodeType === \XmlReader::END_ELEMENT) {
$destination = "on </$xml->name>";
} else if ($xml->nodeType === \XmlReader::ELEMENT) {
$destination = "on <$xml->name id=\"" . $xml->getAttribute("id") . "\">";
}
}
echo " to \"$to\" places the cursor $destination;\n";
$xml->close();
}
?>