使用XML搜索某些父级的子级

时间:2017-03-21 16:15:06

标签: php xml

我有一个关于在PHP中使用DomDocument处理XML文件的问题。

<managedObject class="class1" version="version1" distName="distName1" id="id1">
    <p name="a">Some data</p>
    <p name="b">Some data</p>
    <p name="c">Some data</p>
    <p name="d">Data I need</p>
    <p name="e">Some data</p>
</managedObject>

<managedObject class="class2" version="version2" distName="distName2" id="id2">
    <p name="a">Some data</p>
    <p name="b">Some data</p>
    <p name="c">Some data</p>
    <p name="d">Some data</p>
    <p name="e">Some data</p>
</managedObject>

例如,我需要从名为'd'的元素中获取数据,但前提是它的父元素具有class =“class1”,version =“version1”等。

到目前为止,我尝试过:

$nodes = $finder->query("//*[contains(@distName, 'distName1')][contains(@class, 'class1')][contains(@version, 'version1')]/[contains(@name, 'd')]");
foreach ($nodes as $node) {
    echo " {$node->nodeValue}\n";
}

但它不起作用。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您想要查看[contains(@name, 'd')]的内容是什么?一切:

$nodes = $finder->query("//*[contains(@distName, 'distName1')][contains(@class, 'class1')][contains(@version, 'version1')]/*[contains(@name, 'd')]");
// ------------------------------------------------------------------------------------------------------------------------^ use `*` for any item

只需p

$nodes = $finder->query("//*[contains(@distName, 'distName1')][contains(@class, 'class1')][contains(@version, 'version1')]/p[contains(@name, 'd')]");
// ------------------------------------------------------------------------------------------------------------------------^ use `p` for `p` items only