9

これは初心者の質問かもしれませんが、ユーモアを交えてください。タグに「soap:」が含まれるxml文字列を読み取る場合、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>
                <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)));
?>

私はこの出力を取得します:

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$

なぜこれが起こっているのか、そして文字列の置換を行うのではなく、問題を解決するためのより適切な方法があるのか​​どうか、私はただ興味があります。

4

3 に答える 3

16

コロンが含まれるタグ名は、タグがデフォルト以外の名前空間にあることを示します。SimpleXMLは、一度に1つの名前空間のみを参照するため、->children()メソッドを使用して名前空間を具体的に選択する必要があります。

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

この理由およびその他の理由により、print_rSimpleXMLオブジェクトのデバッグに使用することはお勧めできません。代わりに、この専用機能を試してください。

于 2012-09-19T14:51:38.303 に答える
6

これはうまくいったようです。

ここでそれについて読んでください:SimpleXMLを使用して名前空間でXMLを解析する

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

?>
于 2012-09-19T13:27:20.123 に答える
2

最も単純な:

$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',
  ),
)
于 2015-08-31T11:02:02.210 に答える