SimpleXmlElement和XPath,获取空数组()

16

我在解析Google Checkout响应的XML时遇到了一些小问题。XML直接来自Google服务器,因此XML本身没有问题。

我想获取所有新订单通知标签。

我尝试过这个方法,但每次都返回一个空数组()。

$xml = new SimpleXmlElement($raw_xml);
$notifications = $xml->xpath('notifications');
$notifications = $xml->xpath('/notification-history-response/notifications/new-order-notification');
$notifications = $xml->xpath('//new-order-notification');

一个 XML 片段(仅开头部分)

<notification-history-response xmlns="http://checkout.google.com/schema/2" serial-number="c5cda190-0eb1-4f91-87cd-e656e5598d38">
  <notifications>
    <new-order-notification serial-number="271578974677716-00001-7">
      <buyer-billing-address>
        <address1>19 sandbox st</address1>
        <address2></address2>

XML直接来自谷歌服务器,因此XML本身没有问题。是的,谷歌在这方面几乎像@Jon Skeet一样。他们的XML定义上就是格式良好的。;-) - LarsH
1个回答

29

问题很可能是默认命名空间。请参见

示例:

$sxe->registerXPathNamespace('x', 'http://checkout.google.com/schema/2');
$result = $sxe->xpath('//x:notifications');

如果没有其他命名空间,作为替代方案,只需使用以下代码删除默认命名空间:

str_replace('xmlns="http://checkout.google.com/schema/2"', '', $raw_xml);
在将XML提供给SimpleXmlElement之前进行处理。

6
+1好的解释和实用例子。朋友们,请花点时间理解命名空间。它们并不难,长远来看理解它们比不断地试图规避它们要容易得多。 - LarsH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接