Проблема с ответом на синтаксический анализ PHP - SimpleXMLElement - PullRequest
1 голос
/ 13 февраля 2012

У меня проблемы с использованием функций 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)

У кого-то есть какие-либо идеи относительно того, что я делаю неправильно. Я не выпил достаточно кофе этим утром. У меня возникает соблазн просто разобрать его с помощью регулярных выражений.

1 Ответ

2 голосов
/ 13 февраля 2012

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
...