使用 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_r
或var_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 源代码