【问题标题】:XPATH - get single value returned instead of array phpXPATH - 获取返回的单个值而不是数组 php
【发布时间】:2011-11-19 19:34:37
【问题描述】:

我在 PHP 中使用 Xpath - 我知道我的查询将返回 0 或 1 个结果。

如果返回 1 个结果,我不希望它作为一个数组 - 这是现在返回的内容。我只是想要该值,而无需访问结果的 [0] 元素并转换为字符串。

这可能吗?

【问题讨论】:

    标签: php dom xpath domdocument


    【解决方案1】:

    您的问题表明您正在使用SimpleXML,因为您谈论的是数组。但是很久以前,您接受了DOMDocument 的答案。在任何情况下,其他用户都会去这里寻找 SimpleXML 中的解决方案,但它的工作方式略有不同:

    list($first) = $xml->xpath('//element') + array(NULL);
    

    $first 中的元素如果不是 NULL(对于没有元素),那么仍然是 SimpleXMLElement 类型(取决于 xpath 查询,可以是元素节点或属性节点),但是您可以只转换它在 PHP 中字符串并完成,或者您只是在 字符串上下文 中使用它,例如 echo:

    echo $first;
    

    【讨论】:

    • 更短的方法:$first = current($xml->xpath('//element')) - current() 如果数组为空,则返回 null 且没有错误。
    【解决方案2】:

    使用 'evaluate' 而不是 'query',您可以执行转换等操作。

    另外,如果您只是对多次做某事感到厌烦,只需编写一个函数来完成它......这就是函数背后的全部想法,对吧?

    【讨论】:

    • 我知道一个函数就足够了,但我正在寻找最干净的代码。如果有一个内置的 xpath 方式来获取第一个也是唯一一个节点值,那么这将比编写一个函数来完成它更可取
    • 是的,所以评估会这样做。
    【解决方案3】:

    如果返回 1 个结果,我不希望它作为一个数组 - 这就是返回的内容。我只是想要该值,而无需访问结果的 [0] 元素并转换为字符串。

    XPath's string function 可以做到这一点

    通过返回节点集中文档顺序中第一个节点的字符串值,将节点集转换为字符串。如果节点集为空,则返回一个空字符串。

    和DOMXPath's evaluate方法:

    如果可能,返回一个类型化的结果或一个包含所有与给定 XPath 表达式匹配的节点的 DOMNodeList。

    示例:

    $dom = new DOMDocument;
    $dom->loadXML('<root foo="bar"/>');
    $xp = new DOMXPath($dom);
    var_dump($xp->evaluate('string(/root/@foo)')); // string(3) "bar"
    

    如果有一个内置的 xpath 方式来获取第一个也是唯一一个节点值,那么这将比编写一个函数来完成它更可取

    您可以使用position function:

    位置函数从表达式评估上下文返回一个等于上下文位置的数字。

    示例:

    $dom = new DOMDocument;
    $dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
    $xp = new DOMXPath($dom);
    var_dump($xp->evaluate('string(/root/foo[position() = 1]/@xml:id)')); // string(2) "f1"
    

    或abbreviated syntax

    $dom = new DOMDocument;
    $dom->loadXML('<root><foo xml:id="f1"/><foo xml:id="f2"/></root>');
    $xp = new DOMXPath($dom);
    var_dump($xp->evaluate('string(/root/foo[1]/@xml:id)')); // string(2) "f1"
    

    请注意,在使用 // 使用位置函数查询后代时,由于表达式的计算方式,可能会产生多个结果。

    【讨论】:

      【解决方案4】:

      你可以这样写:

      $string = @$array[0];
      

      @ operator 将抑制错误,如果$array 为空,则使$string 为空。

      【讨论】:

      • @KingCrunch:我不明白你的意思。我的代码不依赖错误。
      • 没有理由使用@。
      • @KingCrunch:我的代码与$string = is_set($array[0]) ? $array[0] : NULL 相同。但是,它更简洁。这完全在@ 运算符的可接受使用范围内。
      【解决方案5】:

      大概

      if ($array[0]){
          $string = $array[0];
      }
      

      ?

      如果$array[0]是一个数组,你可以将字符串重命名为new_array

      if ($array[0]){
          $new_array  = $array[0];
      }
      

      【讨论】:

      • 我需要为大约 20 个值执行此操作 - 所以与其检查每个值,我想知道是否有办法从 cpath 查询中自动获取节点值
      • @Eric:如果你开启了 E_NOTICE,是的
      • @genesis:哦,获取未设置的索引只是一个通知吗?
      • @genesis:每天学习新东西
      猜你喜欢
      • 2018-05-29
      • 2020-08-22
      • 2013-11-15
      • 2015-09-09
      • 2021-03-27
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多