2012-02-13 129 views
1

我在使用PHP SimpleXMLElementsimpleSMLToArray()函數解析SOAP響應時遇到問題。我從SOAP服務器獲得SOAP響應很好。在這種情況下,我正在編寫SOAP客戶端和服務器。我正在使用NuSoap作爲服務器。對我來說,肥皂響應看起來很完美,但PHP5肥皂客戶端似乎沒有解析它。所以,和以前一樣,我使用PHP.NET(http://php.net/manual/en/book.simplexml.php)的SimpleXMLElement和函數simpleXMLToArray(),但似乎無法獲得數組。PHP解析SOAP響應問題 - SimpleXMLElement

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:eCaseWSDL"> 
    <SOAP-ENV:Body> 
     <ns1:registerDocumentByPatientResponse xmlns:ns1="urn:eCaseWSDL"> 
     <returnArray xsi:type="tns:ReturnResult"> 
      <id xsi:type="xsd:int">138</id> 
      <method xsi:type="xsd:string">registerDocumentByPatient</method> 
      <json xsi:type="xsd:string">0</json> 
      <message xsi:type="xsd:string">success</message> 
      <error xsi:type="xsd:string">0</error> 
     </returnArray> 
     </ns1:registerDocumentByPatientResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

來自我的課程的PHP代碼($ this references apply to my library code)。

// Define SimpleXMLElement 
$xml_element = new SimpleXMLElement($response_string); // SOAP XML 
$name_spaces = $xml_element->getNamespaces(true); 
var_dump($name_spaces); 

$soap = $xml_element->children('ns1'); 
var_dump($soap); 

$soap_array = $this->simpleXMLToArray($soap); 
var_dump($soap_array); 

return $soap_array; 

我可以看到命名空間; ns1等,但是,該數組不返回。 SimpleXMLElement看起來像它正在返回一個對象,但是是空的。

<pre>array(3) { 
    ["SOAP-ENV"]=> 
    string(41) "http://schemas.xmlsoap.org/soap/envelope/" 
    ["ns1"]=> 
    string(13) "urn:eCaseWSDL" 
    ["xsi"]=> 
    string(41) "http://www.w3.org/2001/XMLSchema-instance" 
} 
object(SimpleXMLElement)#23 (0) { 
} 
bool(false) 

任何人有任何想法,我做錯了什麼。今天早上我一定不能喝夠咖啡。我很想用正則表達式解析它。

+0

不要... ...使用正則表達式。 .. argggg ... [**小馬,他來了!**](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454 #1732454)另外,我相信這個答案可能會有所幫助... [使用SimpleXML解析名稱空間的XML](http://stackoverflow.com/questions/595946/parse-xml-with-namespace-using-simplexml) – rdlowrey 2012-02-13 17:35:54

回答

2

SimpleXML創建一個樹對象,所以你必須跟隨那棵樹才能到達你想要的節點。

此外,你必須使用實際的命名空間URI訪問時,如:中urn:eCaseWSDL代替ns1

試試這個:

$soap = $xml_element->children($name_spaces['SOAP-ENV']) 
        ->Body 
        ->children($name_spaces['ns1']) 
        ->registerDocumentByPatientResponse 
        ->children(); 

var_dump((string)$soap->returnArray->id); // 138 
+0

我認爲我可以拉t他來自XML對象節點的命名空間。我猜不會。你的解決方案:$ soap = $ xml_element-> children($ name_spaces ['SOAP-ENV']) - > Body-> children($ name_spaces ['ns1']);謝謝! – jjwdesign 2012-02-13 18:42:22