2012-09-18 17 views
6

etiketlerinde bu yeni kullanıcı sorusu olabileceğini biliyorum, lütfen beni şaka yap. Etiketlerde "soap:" yazan bir xml dizesini okurken, xml dosyasında simplexml_load_string() işlevi okunmaz.simplexml_load_string(), "soap:" ile sabun yanıtını okumayacaktır

#!/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> 
       <a n="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))); 
?> 

bu çıktıyı almak: Bu komut verilen

[email protected]:~/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 
       ) 

     ) 

) 
[email protected]:~/code/zmsoap$ 

Ben Bu neden oluyor merak ediyorum ve aynı sorunu gidermek için daha uygun bir yol olup olmadığını bir dize yerine karşı.

+0

ad ile bir sorunu gibi görünüyor. – JvdBerg

cevap

12

varsayılan olmayan bir ad alanında olduğunu. SimpleXML, bir kerede yalnızca bir ad alanına bakar, bu nedenle the ->children() method kullanarak ad alanını özellikle seçmeniz gerekir. Bu durumda, $xml->children('http://www.w3.org/2003/05/soap-envelope')->Body veya $xml->children('soap', true)->Body her ikisi de çalışmalıdır.

Bu ve diğer nedenlerle, SimpleXML nesnelerini hata ayıklamak için print_r kullanılması önerilmez. Bunun yerine this dedicated function'u deneyin.

+0

çözümü için teşekkürler ... uzun aramadan sonra bunu aldım ... – 4naxr

5

Bu işe yaramış gibi görünüyor. Burada bu konuda

Okuma: bir iki nokta üst üste sahip bir etiket adı etiketini gösterir Parse XML with Namespace using 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> 
       <a n="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')); 

?> 
+0

Bunu, XPath'a dokunmadan yapabilir ve sadece basit SimpleXML işlevlerini/operatörlerini kullanabilirsiniz. Az önce eklediğim cevaba bakın. – IMSoP

0

basit:

$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)); 

çıkışı:

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

Bunun nasıl olduğunu göremiyorum *** en basit ***, ayrıca json_decode (json_encode' da herhangi bir anlam ifade etmiyor. –