2011-05-04 116 views
11

Domdocument PHP如何獲得dom元素的第一級? HTTP://stackoverflow.com/questions/1540302/how-to-get-nodes-in-first-level-using-php-domdocumentDomdocument PHP如何獲得dom元素的第一級?

自Q &甲托克 -

與不工作的代碼例

<?php 
$str=<<< EOD 
<div id="header"> 
</div> 
<div id="content"> 
    <div id="sidebar"> 
    </div> 
    <div id="info"> 
    </div> 
</div> 
<div id="footer"> 
</div> 
EOD; 

$doc = new DOMDocument(); 
$doc->loadHTML($str); 
$xpath = new DOMXpath($doc); 
$entries = $xpath->query("/"); 
foreach ($entries as $entry) { 
    var_dump($entry->firstChild->nodeValue); 
} 
?> 

謝謝, 約瑟夫

回答

26

根節點以下元件的第一電平可以與

$dom->documentElement->childNodes 

要訪問的的childNodes屬性包含一個DOMNodeList,您可以使用foreach進行迭代。

DOMDocument::documentElement

這是一種便捷屬性,該屬性允許是文檔的文檔元素的子節點的直接訪問。

DOMNode::childNodes

一個包含此節點的所有孩子的DOMNodeList。如果沒有孩子,這是一個空的DOMNodeList。

由於childNodesDOMNode性能的任何類擴展DOMNode(這是大多數在DOM類的)具有這種屬性,所以要得到一個DOMElement以下元素的第一個層次是訪問一個DOMElement的childNode財產。


注意,如果無效HTML或部分文件使用DOMDocument::loadHTML(),HTML解析器模塊將增加一個HTML框架HTML和body標籤,所以在DOM樹,在您的示例HTML將

<!DOCTYPE html … "> 
<html><body><div id="header"> 
</div> 
<div id="content"> 
    <div id="sidebar"> 
    </div> 
    <div id="info"> 
    </div> 
</div> 
<div id="footer"> 
</div></body></html> 

您在遍歷或使用XPath時必須考慮到這一點。因此,使用

$dom = new DOMDocument; 
$dom->loadHTML($str); 
foreach ($dom->documentElement->childNodes as $node) { 
    echo $node->nodeName; // body 
} 

只會迭代<body>一個DOMElement節點。知道libxml將添加框架,您必須遍歷<body>元素的childNodes以從示例代碼中獲取div元素,例如

$dom->getElementsByTagName('body')->item(0)->childNodes 

但是,這樣做也將考慮任何空白節點,所以你要麼必須確保設置preserveWhiteSpace以虛假或查詢正確的元素nodeType如果你只是想獲得DOMElement節點,例如

foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $node) { 
    if ($node->nodeType === XML_ELEMENT_NODE) { 
     echo $node->nodeName; 
    } 
} 

或使用XPath

$dom->loadHTML($str); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('/html/body/*') as $node) { 
    echo $node->nodeName; 
} 

其他信息:

相關問題