从另一个xpath查询节点查询xpath

时间:2014-05-22 03:31:01

标签: php xml xpath simplexml

如何在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;
}

1 个答案:

答案 0 :(得分:2)

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