使用 DOMDocument PHP 获取 Xpath 父节点?

Posted

技术标签:

【中文标题】使用 DOMDocument PHP 获取 Xpath 父节点?【英文标题】:Get Xpath parent node with DOMDocument PHP? 【发布时间】:2015-09-28 21:42:24 【问题描述】:

我需要在 php.ini 中获取特定节点的父节点。 我正在使用 DOMDocument 和 XPath。 我的 XML 是这样的:

<ProdCategories>
<ProdCategory>

    <Id>138</Id>

    <Name>Parent Category</Name>

    <SubCategories>

        <ProdCategory>

            <Id>141</Id>

            <Name>Category child</Name>

        </ProdCategory>
   </SubCategories>
</ProdCategory>
</ProdCategories>

php代码:

$dom = new DOMDocument();
$dom->load("ProdCategories_small.xml");
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//ProdCategory/Id[.="141"]/parent::*')->item(0);
print_r($nodes); 

打印的是:

 DOMElement Object ( 
 [tagName] => ProdCategory [schemaTypeInfo] => [nodeName] => ProdCategory [nodeValue] => 141 Category child [nodeType] => 1 [parentNode] => (object value omitted) [childNodes] => (object value omitted) [firstChild] => (object value omitted) [lastChild] => (object value omitted) [previousSibling] => (object value omitted)

[parentNode](object value omitted),为什么?我会得到 ​​p>

    <Id>138</Id>

    <Name>Parent Category</Name>`

【问题讨论】:

您问题中设置的最后一个节点是否表示所需的输出?你的 Xpath 表达式可以重写为//ProdCategory[Id[.="141"]],这样行吗? @collapsar 感谢您的回复。不,不起作用。我问题中的最后一个节点就是我想要的。 @collapsar - 甚至是//ProdCategory[Id="141"] 以下 xpath 表达式会产生您指定的结果://ProdCategory[Id='141']/ancestor::ProdCategory/child::*[name() = 'Id' or name()='Name'] 在 xpath 表达式匹配的ProdCategory 的上下文中,父节点是SubCategories。您必须使用 ancestor 轴才能到达外部 Prodcategory - 请参阅我之前的评论。 【参考方案1】:

[parentNode](object value omitted),为什么?

这是因为您使用了print_r function,它会创建这样的输出 (via an internal helper function of the dom extension)。创建它的代码行是:

print_r($nodes);

字符串“(object value omitted)”由 DOMNode 在使用print_rvar_dump 时给出。它告诉您,该字段的对象 value(名为 parentNode)没有显示,而是省略了。

从该消息中,您可以得出结论,该字段的值是一个对象。对类名的简单检查可以验证这一点:

echo get_class($nodes->parentNode), "\n"; # outputs  "DOMElement"

将其与整数或(空)字符串的字段进行比较:

[nodeType] => 1
...
[prefix] => 
[localName] => ProdCategory

所以我希望这可以为您解决问题。只需访问该字段即可获取父节点对象:

$parent = $nodes->parentNode;

完成了。

如果您想知道 PHP 提供给您的某个字符串,并且您觉得它可能是内部的,您可以在 http://lxr.php.net/、here is an example query for the string in your question 上快速搜索 PHP 的所有代码库。

【讨论】:

【参考方案2】:

只需将 xpath 查询节点视为文件系统路径,如 here 所述

向上移动 2 个节点并获取父节点并从中获取所需的信息,例如 Id 或 Name。

例子:

<?php

$dom = new DOMDocument();
$dom->load("ProdCategories_small.xml");
$xpath = new DOMXPath($dom);

$parentNode = $xpath->query('//ProdCategory[Id="141"]/../..')->item(0);

$id = $xpath->query('./Id', $parentNode)->item(0);
$name = $xpath->query('./Name',$parentNode)->item(0);

print "Id: " . $id->nodeValue . PHP_EOL;
print "Name: " . $name->nodeValue . PHP_EOL;

【讨论】:

以上是关于使用 DOMDocument PHP 获取 Xpath 父节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 的 DOMDocument 获取元素的序列化 HTML?

PHP DOMDocument - 获取 BODY 的 html 源代码

PHP DOMDocument 添加了额外的标签

PHP DOMDocument获取标签的属性

使用 DOMDocument,是不是可以获取某个 DOM 中存在的所有元素?

如何在 PHP 中将 XML 字符串转换为 DOMDocument?