【问题标题】:XPath get node by valueXPath 按值获取节点
【发布时间】:2016-02-24 03:58:51
【问题描述】:

我有这个 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']");

我哪里错了?

【问题讨论】:

  • 想知道为什么您从未接受以下答案。

标签: php xml xpath


【解决方案1】:

请试试这个代码

/root/experiment[matches(.,'alfa')]

绝对有效

【讨论】:

    【解决方案2】:

    您的 XPath,

        /root[experiment='alfa']
    

    说:

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

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


    这个 XPath,

        /root/experiment[.='alfa']
    

    说:

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

    并且会选择你寻找的experiment 元素。

    【讨论】:

      【解决方案3】:

      可以使用text()查询节点值:

      $node = $this->xml->xpath("/root/experiment[text()='alfa']");
      

      【讨论】:

      • 请注意此答案与其他答案之间的细微差别。使用. 将结合(它结合因为= 运算符强制雾化)所有子级,无论多么深,使用text() 将仅结合第一级文本子级。如果您必须处理 experiment 元素中的混合内容,这可能很重要。
      • 不,你不应该使用 text()。使用[. = 'alfa']。正如@kjhughes 所建议的那样。使用 text() 将失败,例如,如果文本包含 XML cmets。
      猜你喜欢
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2023-03-16
      相关资源
      最近更新 更多