PHP解析肥皂响应问题 - SimpleXMLElement

时间:2012-02-13 17:27:52

标签: php soap simplexml soap-client nusoap

我在使用PHP SimpleXMLElementsimpleSMLToArray()函数解析SOAP响应时遇到问题。我从SOAP服务器获得SOAP响应就好了。在这种情况下,我正在编写SOAP客户端和服务器。我正在使用 NuSoap 作为服务器。对我来说,soap响应看起来很完美,但PHP5 Soap Client似乎并没有解析它。所以,和过去一样,我使用SimpleXMLElement和PHP.NET(http://php.net/manual/en/book.simplexml.php)中的函数simpleXMLToArray(),但似乎无法获得数组。

<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引用适用于我的库代码)。

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

任何人都对我做错了什么有任何想法。我今天早上一定不能喝足够的咖啡。我很想用正则表达式解析它。

1 个答案:

答案 0 :(得分: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