【问题标题】:Querying xpath from another xpath query node从另一个 xpath 查询节点查询 xpath
【发布时间】:2014-05-22 03:31:01
【问题描述】:

如何在 PHP 中查询另一个 xpath 查询的节点结果?

假设我有以下 XML:

<Orders>
      <Order>
        <OrderTotal>
          <Amount>15.45</Amount>
          <CurrencyCode>USD</CurrencyCode>
        </OrderTotal>
        <ShippingAddress>
          <Name>John Doe</Name>
          <CountryCode>US</CountryCode>
          <StateOrRegion>TX</StateOrRegion>
          <City>Austin</City>
        </ShippingAddress>
      </Order>
</Orders>

这似乎不起作用:

foreach ($xo->xpath("//Orders/Order") as $o) {
    $order['total'] = $o->xpath('OrderTotal/Amount');
}

如果我执行以下操作,那么 total 将有一个值,但我不能像存储 xpath 字符串那样存储对象链:

foreach ($xo->xpath("//Orders/Order") as $o) {
    $order['total'] = (string)$o->OrderTotal->Amount;
}

【问题讨论】:

  • 提供一些示例数据
  • 已将其添加到帖子中!
  • 它对我有用:$order['total'][0] == '15.45';
  • 运气不好。我只是不断收到这个:prntscr.com/3lfj4z
  • 抱歉,应该指定我使用的是 PHP 5.4。我只是想通了问题。如果我将$order['total'] = $o-&gt;xpath('OrderTotal/Amount'); 更改为$order['total'] = (string)$o-&gt;xpath('OrderTotal/Amount')[0];,那么它可以工作。

标签: php xml xpath simplexml


【解决方案1】:

SimpleXMLElement::xpath() 返回一个 SimpleXMLElement 对象数组。您需要从列表中的第一个对象中获取数据。

foreach ($xo->xpath("//Orders/Order") as $o) {
    $order['total'] = $o->xpath('OrderTotal/Amount')[0];
}

可以使用 Xpath 表达式直接返回一个标量值。例如,string() 函数将节点列表的第一个元素转换为字符串。 SimpleXML 不支持这些表达式,您需要使用 DOMXpath::evaluate()。

foreach ($xpath->evaluate("//Orders/Order") as $node) {
    $order['total'] = $xpath->evaluate('string(OrderTotal/Amount)', $node);
}

这是一个用于结果处理的小演示:https://eval.in/155586

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多