使用DomDocument PHP获取Xpath父节点?

时间:2015-07-10 08:14:12

标签: php xml xpath domdocument

我需要在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>`

2 个答案:

答案 0 :(得分:3)

  

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

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

print_r($nodes);

字符串&#34; (object value omitted)&#34;由 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的代码库。

答案 1 :(得分:1)

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