2013-03-25 5 views
0

Есть ли простой способ синтаксического анализа тегов с двоеточиями в имени тега с помощью SimpleXML xpath?Разбор тегов с двоеточиями с использованием SimpleXML xpath в PHP

Пример:

<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; 

    } 

ответ

0

Посмотрите this.

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

От PHP Manual:

Создает префикс/нс контекст для следующего запроса XPath. В частности, это полезно, если поставщик данного XML-документа изменяет префиксы пространства имен . registerXPathNamespace создаст префикс для связанного пространства имен, позволяя получить доступ к узлам в этом пространстве имен без необходимости изменения кода, чтобы разрешить новые префиксы , продиктованные поставщиком.

+0

Это относится только к использованию XPath, а не к нормальному доступу к объекту и массиву, предоставляемому SimpleXML ('-> node' и' ['attribute'] '). – IMSoP

+0

@IMSoP: это альтернативное рабочее решение, не знаю, почему вы остановили его. – DonCallisto

+0

Да, но вы на самом деле не объяснили, как его использовать, так как это похоже на то, как исправить код OP, который кроме одной строки был * не *, используя XPath, и это не нужно. – IMSoP

-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; 


     } 
+1

'registerXPathNamespace' необходимо, только если вы используете' -> xpath() '. Метод '-> children()' основан исключительно на самом XML. – IMSoP

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)).

Смежные вопросы