如何通过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);
}
?>
谢谢, 约瑟夫
答案 0 :(得分:28)
可以使用
访问根节点下的第一级元素$dom->documentElement->childNodes
childNodes属性包含DOMNodeList
,您可以使用foreach
进行迭代。
请参阅DOMDocument::documentElement
这是一个便利属性,允许直接访问作为文档文档元素的子节点。
包含此节点的所有子节点的DOMNodeList。如果没有子节点,则这是一个空的DOMNodeList。
由于childNodes
是DOMNode
的属性,因此扩展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;
}
}
其他信息: