2015-06-03 147 views
1

如果我有這樣的例子一個XML:DOM XML子節點

<?xml version="1.0" encoding="utf-8" ?> 
    <parent > 
    <child> 
     <grandchild> 
     </grandchild> 
    </child> 
    </parent> 

,我希望得到父節點的所有孩子(例如使用PHP), 當我打電話

$xmlDoc->loadXML('..'); 

$rootNode = $xmlDoc->documentElement; 

$children = $rootNode->childNodes; 

$children包含什麼? 它將只包含<child>節點嗎?它會包含<child><grandchild>兩者嗎?

+0

試試看...... [這裏,例如(https://eval.in/374902):它包含3個節點,子和孫,以及它的內容(文本) –

+0

我的轉儲輸出是: '輸出對象(DOMNodeList)#3(1){[「length」] => int(1)}'在eclipse中和PHP 5.5。 然後這意味着它只獲得''節點。不是嗎? –

+0

'foreach($ rootNode-> childNodes as $ node){echo $ node-> tagName,PHP_EOL; }'會告訴你,你可以依賴的其他屬性包括'nodeName'和'nodeType' ... [見手冊](http://php.net/manual/en/class.domnode.php) –

回答

1

parent文檔元素節點有3個子節點。元素節點child之前和包含空格兩個文本節點的節點之後:

$document = new DOMDocument(); 
$document->loadXml($xml); 
foreach ($document->documentElement->childNodes as $childNode) { 
    var_dump(get_class($childNode)); 
} 

輸出:

string(7) "DOMText" 
string(10) "DOMElement" 
string(7) "DOMText" 

如果禁用該文檔的保存空格選項,它會刪除空白加載xml時節點。

$document = new DOMDocument(); 
$document->preserveWhiteSpace = FALSE; 
$document->loadXml($xml); 
... 

輸出:

string(10) "DOMElement" 

以更靈活的方式使用XPath來獲取節點。它允許您使用表達式來獲取節點:

$document = new DOMDocument(); 
$document->loadXml($xml); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('/*/child|/*/child/grandchild') as $childNode) { 
    var_dump(get_class($childNode), $childNode->localName); 
} 

輸出:

string(10) "DOMElement" 
string(5) "child" 
string(10) "DOMElement" 
string(10) "grandchild"