simplexml_load_string () не будет считывать мыльный ответ с помощью "soap:" в тегах

Я знаю, что это может быть вопрос новичков, но, пожалуйста, юмор меня. При чтении строки xml с «soap:» в тегах simplexml_load_string () не будет читать в xml.

с учетом этого сценария:

#!/usr/bin/php <?php $s=' <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> <context xmlns="urn:zimbra"/> </soap:Header> <soap:Body> <AuthResponse xmlns="urn:zimbraAdmin"> <authToken>somevalue</authToken> <lifetime>123124123</lifetime> <an="zimbraIsDomainAdminAccount">false</a> </AuthResponse> </soap:Body> </soap:Envelope>'; print_r(simplexml_load_string($s)); echo "\n\n"; print_r(simplexml_load_string(str_ireplace("soap:", "", $s))); ?> 

Я получаю этот вывод:

 jesse@jesse-debian:~/code/zmsoap$ ./xmltest.php SimpleXMLElement Object ( ) SimpleXMLElement Object ( [Header] => SimpleXMLElement Object ( [context] => SimpleXMLElement Object ( ) ) [Body] => SimpleXMLElement Object ( [AuthResponse] => SimpleXMLElement Object ( [authToken] => somevalue [lifetime] => 123124123 [a] => false ) ) ) jesse@jesse-debian:~/code/zmsoap$ 

Мне просто интересно, почему это происходит, и если есть более правильный способ устранить проблему, а не заменять строку.

Имя тега с двоеточием указывает, что тег находится в пространстве имен, отличном от значения по умолчанию. SimpleXML рассматривает только одно пространство имен за раз, поэтому вам нужно специально выбрать пространство имен с помощью метода ->children() .

В этом случае $xml->children('http://www.w3.org/2003/05/soap-envelope')->Body или $xml->children('soap', true)->Body должны оба Работа.

По этой и другим причинам не рекомендуется использовать print_r для отладки объектов SimpleXML. Вместо этого попробуйте эту функцию .

Кажется, это сработало.

Читайте об этом здесь: Parse XML с пространством имен с помощью SimpleXML

 #!/usr/bin/php <?php $s=' <soap:Envelope xmlns:soap="urn:zimbra"> <soap:Header> <context xmlns="urn:zimbra"/> </soap:Header> <soap:Body> <AuthResponse xmlns="urn:zimbraAdmin"> <authToken>somevalue</authToken> <lifetime>123124123</lifetime> <an="zimbraIsDomainAdminAccount">false</a> </AuthResponse> </soap:Body> </soap:Envelope>'; //print_r(simplexml_load_string($s)); //echo "\n\n"; //print_r(simplexml_load_string(str_ireplace("soap:", "", $s))); $xml = simplexml_load_string($s); $xml->registerXPathNamespace("soap", "http://www.w3.org/2003/05/soap-envelope"); print_r($xml->xpath('//soap:Body')); ?> 

Простейшие:

 $xml='<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><AddOrderResult>1</AddOrderResult></soap:Body></soap:Envelope>'; var_export(json_decode(json_encode(simplexml_load_string(strtr($xml, array(' xmlns:'=>' ')))), 1)); 

вывод:

 array ( '@attributes' => array ( 'soap' => 'http://schemas.xmlsoap.org/soap/envelope/', ), 'soap:Body' => array ( 'AddOrderResult' => '1', ), )