У меня возникают проблемы с использованием PHP SimpleXMLElement
и simpleSMLToArray()
для анализа SOAP-ответа. Я получаю SOAP-ответ от моего SOAP-сервера просто отлично. В этом случае я пишу как клиент SOAP, так и сервер. Я использую NuSoap для сервера. Для меня реакция на мыло выглядит идеально, но PHP5 Soap Client, похоже, не анализирует ее. Итак, как и в прошлом, я использую SimpleXMLElement
и функцию simpleXMLToArray()
из PHP.NET ( http://php.net/manual/en/book.simplexml.php ), но, похоже, не может получить массив.
<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-код из моего класса (эти ссылки относятся к моему библиотечному коду).
// 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)
У любого есть идеи относительно того, что я делаю неправильно. Сегодня утром я не должен был выпить достаточно кофе. Я соблазн просто разобрать его с помощью регулярных выражений.
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