Yos*_*sef 14 php xpath domdocument
如何通过Domdocument PHP获得第一级dom元素?
代码不起作用的示例 - 来自问答: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);
}
?>
Run Code Online (Sandbox Code Playgroud)
谢谢你,约瑟夫
Gor*_*don 30
可以使用以下方法访问根节点下的第一级元素
$dom->documentElement->childNodes
Run Code Online (Sandbox Code Playgroud)
childNodes属性包含a DOMNodeList,您可以迭代它foreach.
看到 DOMDocument::documentElement
这是一个便捷属性,允许直接访问作为文档的文档元素的子节点.
包含此节点的所有子节点的DOMNodeList.如果没有子节点,则这是一个空的DOMNodeList.
由于childNodes是DOMNode任何类扩展的属性DOMNode(DOM中的大多数类)都具有此属性,因此要获取a下面的第一级元素DOMElement是访问该DOMElement的childNode属性.
请注意,如果您使用DOMDocument::loadHTML()无效的HTML或部分文档,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>
Run Code Online (Sandbox Code Playgroud)
在遍历或使用XPath时必须考虑的因素.因此,使用
$dom = new DOMDocument;
$dom->loadHTML($str);
foreach ($dom->documentElement->childNodes as $node) {
echo $node->nodeName; // body
}
Run Code Online (Sandbox Code Playgroud)
将仅迭代<body>DOMElement节点.知道libxml将添加骨架,您将不得不遍历<body>元素的childNodes 以从示例代码中获取div元素,例如
$dom->getElementsByTagName('body')->item(0)->childNodes
Run Code Online (Sandbox Code Playgroud)
但是,这样做也会考虑任何空白节点,因此如果您只想获取节点,则必须确保设置preserveWhiteSpace为false或查询正确的元素nodeTypeDOMElement,例如
foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $node) {
if ($node->nodeType === XML_ELEMENT_NODE) {
echo $node->nodeName;
}
}
Run Code Online (Sandbox Code Playgroud)
或使用XPath
$dom->loadHTML($str);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('/html/body/*') as $node) {
echo $node->nodeName;
}
Run Code Online (Sandbox Code Playgroud)
附加信息: