0

有没有一种简单的方法可以使用 SimpleXML xpath 解析标签名称中带有冒号的标签?

例子:

<v12:ProcessShipmentResponse>SUCCESS</v12:ProcessShipmentResponse>

这是我用来解析未命名空间但与命名空间标签中断的标签的代码。

    $xml = simplexml_load_string($responseXMLL, NULL, NULL, 'http://schemas.xmlsoap.org/soap/envelope/');


    foreach ($xml->xpath('soapenv:Body') as $body) {


        $custInfoArr['status'] = (string) $body->v12:ProcessShipmentReply->v12:HighestSeverity;
        $custInfoArr['trackingCode'] = (string) $body->v12:ProcessShipmentReply->v12:CompletedShipmentDetail->v12:CompletedPackageDetails->v12:TrackingIds->v12:TrackingNumber;
        $custInfoArr['labelCode'] = (string) $body->v12:ProcessShipmentReply->v12:CompletedShipmentDetail->v12:CompletedPackageDetails->v12:Label->v12:Parts->v12:Image;

    }
4

3 回答 3

0

这个问题之前已经问过很多次了。这些不是“带有冒号的标签”,它们是 XML 命名空间,需要在任何解析器中进行特殊处理。

对于 SimpleXML,这是由->children()->attributes()方法提供的。

您可以依赖别名/前缀不变(不能保证这一点,因为 XML 文档的“语义”不会改变)并true用作第二个参数(在您的情况下$body->children('v12', TRUE))或为命名空间设置一个常量URI(保证不会改变)并通过它(在你的情况下define('XMLNS_FEDEX_V12', 'http://fedex.com/ws/ship/v12'); /* ... */ $body->children(XMLNS_FEDEX_V12))。

于 2013-03-28T19:19:54.990 回答
0

看看这个

 public bool SimpleXMLElement::registerXPathNamespace(string $prefix,string $ns);

来自php手册:

为下一个 XPath 查询创建一个前缀/ns 上下文。特别是,如果给定 XML 文档的提供者更改了名称空间前缀,这将很有帮助。registerXPathNamespace 将为关联的命名空间创建一个前缀,允许访问该命名空间中的节点,而无需更改代码以允许提供者指定的新前缀。

于 2013-03-25T16:33:32.790 回答
-1

需要像这样注册命名空间。这是一个工作示例,以防有人需要。

        $xml = simplexml_load_string($result, NULL, NULL, 'http://schemas.xmlsoap.org/soap/envelope/');
        $xml->registerXPathNamespace('env', 'http://schemas.xmlsoap.org/soap/envelope/');
        $xml->registerXPathNamespace('v12', 'http://fedex.com/ws/ship/v12');
        $bodies = $xml->xpath('env:Body');

        foreach($bodies as $body){

          $reply = $body->children('v12', TRUE)->ProcessShipmentReply;
          $custInfoArr['status'] = (string) $reply->HighestSeverity;
          $custInfoArr['trackingCode'] = (string) $reply->CompletedShipmentDetail->CompletedPackageDetails->TrackingIds->TrackingNumber;
          $custInfoArr['labelCode'] = (string) $reply->CompletedShipmentDetail->CompletedPackageDetails->Label->Parts->Image;


        }
于 2013-03-25T16:46:32.067 回答