simplexml_load_string()不会在标记中使用"soap:"读取soap响应

jes*_*ley 8 php xml curl soap simplexml

我知道这可能是一个新手问题,但请幽默我.在标签中读取带有"soap:"的xml字符串时,xml中不会读取simplexml_load_string().

给出这个脚本:

#!/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)));
?>
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

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$
Run Code Online (Sandbox Code Playgroud)

我只是好奇为什么会发生这种情况,并且如果有更合适的方法来解决问题,而不是进行字符串替换.

IMS*_*SoP 14

带冒号的标记名称表示标记位于非默认名称空间中.SimpleXML一次只查看一个名称空间,因此您需要使用->children()方法专门选择名称空间.

在这种情况下$xml->children('http://www.w3.org/2003/05/soap-envelope')->Body$xml->children('soap', true)->Body两者都应该工作.

由于这个原因和其他原因,不建议使用print_r调试SimpleXML对象.请尝试使用此专用功能.


jes*_*ley 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'));

?>
Run Code Online (Sandbox Code Playgroud)