例如我们有这个xml:
<body>
<a>
<b>
<c>hello</c>
<c>world</c>
</b>
</a>
<a>
<b>
<c>another hello</c>
<c>world</c>
</b>
</a>
</body>
通过Xpath查询,我们可以找到所有“B”-tags。但是,我们需要在每个找到的“B”标签中找到所有“C”标签。 我写了这段代码:
$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$btags = $xpath->query("//b");
foreach ($btags as $b)
{
$ctags = $xpath->query("/b/c", $b);
foreach ($ctags as $c) {
echo $c->nodeValue;
}
}
但它不起作用。 可以使用XPath查询执行此操作吗?
答案 0 :(得分:7)
对于您的第二个XPath,请尝试以下方式:$ctags = $xpath->query("c", $b);
第二个XPath已经相对于'b'节点...如果我没有弄错,PHP XPath语句中的相对路径要求省略前导'/'。
答案 1 :(得分:0)
到达第二个查询时,您已经处于'b'元素。您的代码正在寻找的是“// b / b / c”。请尝试在第二个查询中使用“/ c”。如果您不打算用“b”做任何事情,也可以使用“// b / c”将其移动到一个查询中。
答案 2 :(得分:0)
Robert Hui没有错。
FYI
//b
选择文档中任何位置类型为b的所有元素,但使用/
表示选择根节点,因此/b/c
正在尝试选择具有子节点的根节点b { {1}}。根节点是body元素。