根节点下的第一级元素可以使用
$dom->documentElement->childNodes
子节点属性包含一个 DOMNodeList
,您可以使用 该列表进行迭代。foreach
请参阅 DOMDocument::d ocumentElement
这是一个便利属性,允许直接访问作为文档元素的子节点。
和 DOMNode::childNodes
包含此节点的所有子节点的 DOMNodeList。如果没有子级,则这是一个空的 DOMNodeList。
由于 是任何类扩展的属性(这是 DOM 中的大多数类)都具有此属性,因此要获取 a 下面的第一级元素,就要访问该 DOMElement 的 childNode 属性。childNodes
DOMNode
DOMNode
DOMElement
请注意,如果您在无效的HTML或部分文档上使用,HTML解析器模块将添加带有html和body标签的HTML框架,因此在DOM树中,示例中的HTML将是DOMDocument::loadHTML()
<!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
}
将仅迭代 DOMElement 节点。知道libxml将添加框架,您将不得不迭代元素的子节点以从示例代码中获取div元素,例如<body>
<body>
$dom->getElementsByTagName('body')->item(0)->childNodes
但是,这样做也会考虑任何空格节点,因此,如果您只想获取节点,则必须确保设置为 false 或查询正确的元素 nodeType,例如preserveWhiteSpace
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;
}
附加信息: