首页 > 解决方案 > 使用php遍历DOM、DomNodeList

问题描述

我想问一下为什么查询“团队”节点可以给我一些结果(计数= 1,长度= 1)而不是“根”或“子团队”。所有节点“根、团队和子团队”都是 Nodelist 类型。

如果我没记错的话,计数 1 表示列表中的节点数.. 那么为什么“root”和“subteam”返回 0。

$dom = new DomDocument();
$string = <<<XML
<?xml version='1.0'?> 
<root> 
<teams>
<subteams>
    <cmd>login</cmd> 
    <login>Richard</login> 
</subteams>
</teams>

</root> 
XML;


$dom->loadXML($string);

$xpath = new DomXPath($dom);
/*DOMNodeList*/
$queryNode = $xpath->query("subteams"); //length 0, count 0
//$queryNode = $xpath->query("root"); //length 0, count 0
//$queryNode = $xpath->query("teams"); //length 1, count 1

echo "length " . $queryNode->length . "<br>";
echo "count " . $queryNode->count() . "<br>";
var_dump( $queryNode); // only for teams node - object(DOMNodeList)#4 (1) { ["length"]=> int(1) }

谢谢

请看 D​​OM 图片

标签: phpdomtraversal

解决方案


您的 XPath 表达式缺少路径分隔符。

例如,如果您想要subteams文档中的所有位置,请使用

$queryNode = $xpath->query("//subteams");

你也可以使用

$queryNode = $xpath->query("/root/team/subteams");

或者

$queryNode = $xpath->query("team/subteams");

"team"之所以有效,是因为您的查询的默认上下文是文档元素,即<root>.

https://www.w3.org/TR/xpath-30/#id-path-expressions


推荐阅读