XPath通过值获取节点

5

我有这个XML:

<root>
  <experiment accessCount="1" downloadCount="1">alfa</experiment>
  <experiment accessCount="1" downloadCount="1">beta</experiment>
</root>

我想检测节点实验是否存在,并且值是alfa。 但是这段PHP代码返回给我所有的值。
    $this->xml = simplexml_load_file("data/stats.xml") or die("Error: Cannot create object");
    $node = $this->xml->xpath("/root[experiment='alfa']");

我哪里做错了?


想知道为什么您从未接受下面的答案。 - kjhughes
3个回答

5
你的XPath:
    /root[experiment='alfa']

说:

选择包含字符串值等于 'alfa'experiment 元素的 root 元素。

在您的示例中有一个这样的 root 元素,它包含两个 experimental 元素。


这个 XPath 表达式,

    /root/experiment[.='alfa']

说:

选择字符串值等于 'alfa'experiment 元素。

这将选择您要查找的一个 experiment 元素。


0
您可以使用text()查询节点值:
$node = $this->xml->xpath("/root/experiment[text()='alfa']");

2
请注意此答案与其他答案之间的微小差异。使用 . 将合并(由于 = 运算符强制原子化,因此会合并)所有子元素,无论多深,而使用 text() 仅合并第一级文本子元素。如果您必须处理 experiment 元素中的混合内容,则这可能很重要。 - Abel
1
不,你不应该使用text()。像@kjhughes建议的那样使用[. = 'alfa']。如果文本包含XML注释,则使用text()会失败。 - Michael Kay

-1
请尝试这段代码。
/root/experiment[matches(.,'alfa')]

会绝对正常工作


matches() 需要 XPath 2.0,而在测试字面相等性时也过于复杂。 - kjhughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接