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

2022-08-31 00:26:44

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

代码不起作用的示例 - 取自问答:如何使用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

根节点下的第一级元素可以使用

$dom->documentElement->childNodes

子节点属性包含一个 DOMNodeList,您可以使用 该列表进行迭代。foreach

请参阅 DOMDocument::d ocumentElement

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

DOMNode::childNodes

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

由于 是任何类扩展的属性(这是 DOM 中的大多数类)都具有此属性,因此要获取 a 下面的第一级元素,就要访问该 DOMElement 的 childNode 属性。childNodesDOMNodeDOMNodeDOMElement


请注意,如果您在无效的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,例如preserveWhiteSpaceDOMElement

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

附加信息:


答案 2

推荐