2024 日本 PHP 研討會

XMLReader::next

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

XMLReader::next將游標移至下一個節點,略過所有子樹

說明

公開 XMLReader::next(?字串 $name = null): 布林值

將游標定位到下一個節點,跳過所有子樹。如果不存在此類節點,則游標將移至文件末尾。

參數

name

要移動到的下一個節點的名稱。

返回值

成功時返回 true,失敗時返回 false

更新日誌

版本 說明
8.0.0 name 現在可以為 null。

另請參閱

新增註釋

使用者貢獻的註釋 3 則註釋

5
ppp dot BOTSNEEDNOTAPPLY at salesfloor dot net
9 年前
此方法似乎遵循以下規則

- 如果 $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();
}
?>
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