【问题标题】:Should this xPath query be returning an array, or a single value in PHP?这个 xPath 查询应该返回一个数组还是 PHP 中的单个值?
【发布时间】:2021-03-27 00:50:36
【问题描述】:

认为我在使用 xPath 时遇到了问题,它的行为与我预期的不一样,尽管我可能预期会出现问题!

所以我想问一下为什么我用于从属性值设置 PHP 变量的以下行返回一个数组,在我得到值之前有几个级别,而不是值的字符串。

我的 XML 文件的开头是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<ReaderDetails updated="16/12/2020 10:33:02">

我想将 'updated' 的值作为字符串获取,并设置为一个变量,我相信我可以这样做:

$updated = simplexml_load_string(file_get_contents($xml), null, true)->xpath('//ReaderDetails/@updated');

但是,在 NetBeans 中调试时,我从变量中得到的结果是一个嵌套数组,里面有属性名称和值:

有人可以帮助我解决我的 PHP 变量行(尤其是 Xpath)为什么它没有按预期工作吗?

补充说明:

  1. 只有一个ReaderDetails节点

【问题讨论】:

  • 你得到一个嵌套数组,因为 PHP 都知道,可能有多个 ReaderDetails 节点。它会给你找到每个节点的属性。
  • 好的,谢谢。我知道文件中只有一个 ReaderDetails 节点,如果这有什么不同?
  • 当然,但我的意思是 API 没有,所以它总是返回一个数组。它不会改变它返回的内容,只是在 XML 结构是 X 而不是 Y 的情况下。
  • 好的,我明白这一点,所以我可以删除第一个数组,但将[0] 添加到行尾,但更重要的是我需要得到的@attribute 和值。

标签: php xml xpath


【解决方案1】:

我碰巧偶然发现了一个解决这个问题的答案,方法是在设置变量后将其设置为字符串。

$updated = simplexml_load_string(file_get_contents($xml), null, true)->xpath('//ReaderDetails/@updated')[0];
$updated = (string) $updated;

这会以字符串形式返回变量,其中包含属性的日期和时间值。

【讨论】:

    【解决方案2】:

    SimpleXMLElement::xpath() 将始终返回 SimpleXMLElement 实例的数组。如果你的表达式匹配的不是元素节点,它仍然会模拟一个可以转换为字符串的值。

    $xml = <<<'XML'
    <ReaderDetails updated="16/12/2020 10:33:02"/>
    XML;
    
    $updated = simplexml_load_string($xml, null, true)->xpath('//ReaderDetails/@updated');
    var_dump((string)$updated[0]);
    var_dump($updated);
    

    输出:

    string(19) "16/12/2020 10:33:02"
    array(1) {
      [0]=>
      object(SimpleXMLElement)#2 (1) {
        ["@attributes"]=>
        array(1) {
          ["updated"]=>
          string(19) "16/12/2020 10:33:02"
        }
      }
    }
    

    DOMXpath::evaluate() 能够直接返回标量值 - 取决于 xpath 表达式:

    $xml = <<<'XML'
    <ReaderDetails updated="16/12/2020 10:33:02"/>
    XML;
    
    $document = new DOMDocument();
    $document->loadXML($xml);
    $xpath = new DOMXpath($document);
    
    $nodeList = $xpath->evaluate('//ReaderDetails/@updated');
    var_dump(get_class($nodeList));
    var_dump(get_class($nodeList[0]));
    $nodeContent = $xpath->evaluate('string(//ReaderDetails/@updated)');
    var_dump($nodeContent);
    

    输出:

    string(11) "DOMNodeList"
    string(7) "DOMAttr"
    string(19) "16/12/2020 10:33:02"
    

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多