2012-09-18 14 views
6

これは初心者の質問かもしれませんが、私をユーモアしてください。タグで「soap:」を含むxml文字列を読み取ると、xmlでsimplexml_load_string()が読み取られません。simplexml_load_string()はタグ内に "soap:"という名前のsoapレスポンスを読みません

は、このスクリプトを与えられた:

#!/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))); 
?> 

私はこの出力を得る:

[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$ 

なぜこれが起こっている私はちょうど好奇心が強い、とのような課題を解決するために、より適切な方法があるかどうか文字列の置換を行うことに反対します。

+0

は、名前空間に問題があるように見えます。 – JvdBerg

答えて

12

は、デフォルト以外の名前空間にあります。 SimpleXMLは一度に1つのネームスペースのみを調べるため、具体的にはthe ->children() methodを使用してネームスペースを選択する必要があります。

この場合、$xml->children('http://www.w3.org/2003/05/soap-envelope')->Bodyまたは$xml->children('soap', true)->Bodyの両方が機能するはずです。

SimplexMLオブジェクトをデバッグするのに、print_rを使用することはお勧めできません。代わりにthis dedicated functionを試してください。

+0

解決策に感謝しています...長い検索の後にこれを得ました... – 4naxr

5

これは機能しているようです。ここではそれについて

読む:のコロンとタグ名がタグを示し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

これは、XPathに触れることなく、単純なメインのSimpleXML関数/演算子を使用することなく行うことができます。私が今追加した答えを見てください。 – IMSoP

0

最も単純:

$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', 
), 
) 
+0

これはどのように*** ***最も単純なことがわかりません、また 'json_decode(json_encode'は意味をなさない。 –

関連する問題