使用DOMDocument PHP获取Xpath父节点


Get Xpath parent node with DOMDocument PHP?

我需要在php中获得特定节点的父节点。我使用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) ,为什么?我会得到

    <Id>138</Id>
    <Name>Parent Category</Name>`

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

这是因为您使用了print_r函数,它创建了这样一个输出(通过dom扩展的内部辅助函数)。创建它的代码行是:

print_r($nodes);

字符串" (object value omitted) "是由DOMNode给出的,当print_rvar_dump在其上使用时。它告诉您,该字段(名为parentNode)的对象不显示,而是省略。

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

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

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

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

我希望这能让你明白。只需访问该字段以获取父节点对象:

$parent = $nodes->parentNode;

如果你想知道PHP给你的某个字符串,你觉得它可能是内部的东西,你可以快速搜索所有PHP的代码库http://lxr.php.net/,这里是一个例子查询字符串在你的问题

仅将xpath查询节点视为文件系统路径,如这里所述

向上移动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;