我正在使用PHP DOM擴展來解析一些XML以便以某種其他形式存儲數據。毫不奇怪,當我解析一個元素時,我經常需要獲得某個名字的所有子元素。有方法DOMElement::getElementsByTagName($name)
,但它會返回具有該名稱的所有後代,而不僅僅是直接的子代。也有屬性DOMNode::$childNodes
但(1)它包含節點列表,而不是元素列表,即使我設法將列表項目變成元素(2)我仍然需要檢查所有的名稱。是否真的沒有優雅的解決方案來獲取某些特定名稱的孩子,或者我在文檔中丟失了什麼?PHP DOM:如何以優雅的方式通過標籤名稱獲取子元素?
一些例證:
<?php
DOMDocument();
$document->loadXML(<<<EndOfXML
<a>
<b>1</b>
<b>2</b>
<c>
<b>3</b>
<b>4</b>
</c>
</a>
EndOfXML
);
$bs = $document
->getElementsByTagName('a')
->item(0)
->getElementsByTagName('b');
foreach($bs as $b){
echo $b->nodeValue . "\n";
}
// Returns:
// 1
// 2
// 3
// 4
// I'd like to obtain only:
// 1
// 2
?>
OTOH,只需在上下文節點上運行'DOMXPath :: query'即可。 (或添加整個文檔,並查詢'/ a [1]/b') – Wrikken
在現實生活中,我解析了相當大的文件,所以我使用DOMReader和它的方法expand()來解析塊。不幸的是,副作用是我沒有'DOMDocument',只有很多'DOMElement'的實例,我無法爲他們優雅地構造'DOMXPAth' ...爲什麼這些想法很糟糕!我想避免將'DOMElment'再次轉換爲'SimpleXML',但我越來越接近這個決定...... – Kalmar