如何通过Domdocument PHP获得第一级dom元素?

时间:2011-05-04 11:08:12

标签: php xpath domdocument

如何通过Domdocument PHP获得第一级dom元素?

代码不起作用的示例 - 来自Q& A:http://stackoverflow.com/questions/1540302/how-to-get-nodes-in-first-level-using-php-domdocument

<?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);
}
?>

谢谢, 约瑟夫

1 个答案:

答案 0 :(得分:28)

可以使用

访问根节点下的第一级元素
$dom->documentElement->childNodes

childNodes属性包含DOMNodeList,您可以使用foreach进行迭代。

请参阅DOMDocument::documentElement

  

这是一个便利属性,允许直接访问作为文档文档元素的子节点。

DOMNode::childNodes

  

包含此节点的所有子节点的DOMNodeList。如果没有子节点,则这是一个空的DOMNodeList。

由于childNodesDOMNode的属性,因此扩展DOMNode(DOM中的大多数类)的任何类都具有此属性,因此要获得下面的第一级元素DOMElement将访问DOMElement的childNode属性。


请注意,如果对无效的HTML或部分文档使用DOMDocument::loadHTML(),HTML解析器模块将添加带有html和body标签的HTML骨架,因此在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设置为false或查询正确的元素nodeType,如果您只想获取{ {1}}节点,例如

DOMElement

或使用XPath

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

其他信息: