2012-08-07 61 views
0

我想解析在PHP中使用simplexml_load_string具有名稱空間的XML文件。 xml響應的示例如下:http://pastie.org/4404714如何使用具有名稱空間的PHP解析XML響應?

通常我會使用simplexml_load_string命令解析此問題,然後將結果轉儲出來以獲取一個很好的易讀樹,以便我可以訪問這些對象。但是,在這種情況下,所有數據甚至不會顯示。 AttributeSets下面的段完全不顯示。我必須輸出原始的xml才能看到它們。

我讀過其他類似的stackoverflow答案,我可以忽略標籤中的名稱空間部分,但我無法讓它工作。有人可以請幫忙。例如,我將如何從此響應中打印出作者,身高或版本。謝謝

+0

[我如何使用SimpleXML解析包含自定義名稱空間的XML?](http://stackoverflow.com/questions/1133897/how-do-i-parse-xml-containing-custom-namespaces-using- simplexml) – vascowhite 2012-08-07 09:18:22

回答

0

經過大量的研究,我找到了兩種解決方法。一種是正確的方式,另一種是快速和骯髒的。它解釋瞭如何以正確的方式做到這一點。我能夠在PHP中使用simple_xml_load_string解析字符串,然後獲取包含不同名稱空間的對象的子項,就像該頁面上的示例中那樣。這是一個痛苦,但可行。

最後,由於我只是需要一個簡單而快速的解決方案,我使用原始XML數據並做了一個str_replace('ns2:','',$rawxml),然後用simple_xml_load_string解析它,它的工作原理就像一個魅力。我只是$call->it->like->this

有些人不會喜歡這個解決方案,但命名空間用於避免重複字段,並且由於我解析和使用數據的方式的性質,這對我來說不會是個問題。

0

也許this question here on SO會幫助你。

基本上,答案表明您必須爲每個您使用的simpleXMLElement對象註冊名稱空間。從鏈接的問題

例如:

$xml = new SimpleXMLElement($r); 
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event'); 

foreach($xml->xpath('//e:event') as $event) { 
    $event->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event'); 
    var_export($event->xpath('//e:sessionKey')); 
} 

或者作爲另一種解決方案說明:它的工作沒有registerXPathNamespace並在XPath查詢完整的命名空間前綴:

$xml = new SimpleXMLElement($r); 

foreach($xml->xpath('//event:event') as $event) { 
    var_export($event->xpath('event:sessionKey')); 
} 
+0

我讀過這個問題並嘗試了答案,但我無法弄清楚如何將其應用於我的情況。該示例中的XML佈局與我發佈的示例中的我的佈局不同。有沒有人有任何想法如何編寫,以便它將與我的示例XML工作? – user1452536 2012-08-07 21:24:14