2013-03-25 69 views
0

是否有一種簡單的方法可以使用SimpleXML xpath來解析標籤名稱中冒號的標籤?使用PHP中的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; 

    } 

回答

0

看看到this

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

從PHP手冊:

創建用於下一​​XPath查詢的前綴/ ns的上下文。特別是, 如果給定的XML文檔的提供者更改了 命名空間前綴,這會很有幫助。 registerXPathNamespace將爲關聯的名稱空間創建一個前綴 ,允許用戶訪問該 名稱空間中的節點,而無需更改代碼以允許提供程序指定的新的 前綴。

+0

這隻與使用XPath有關,而不是SimpleXML(' - > node'和'['attribute']')提供的普通對象和數組式訪問。 – IMSoP 2013-03-28 19:11:18

+0

@IMSoP:是一種替代工作解決方案,不知道爲什麼你低估了。 – DonCallisto 2013-03-29 07:53:27

+0

是的,但你沒有真正解釋如何使用它,看起來這是如何解決OP的代碼,除了一行是*不*使用XPath,並且不需要。 – IMSoP 2013-03-29 11:44:01

-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 2013-03-28 19:06:22

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