simplexml_load_string() 不会读取带有“soap:"的soap响应;在标签中

2021-12-24 00:00:00 xml curl php simplexml soap

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

I know this may be a newbie question, but please humor me. When reading an xml string with "soap:" in the tags, simplexml_load_string() will not read in the 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 "

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

我只是很好奇为什么会发生这种情况,以及是否有比进行字符串替换更合适的方法来解决该问题.

I'm just curious why this is happening, and if there is a more proper way to remedy the problem as opposed to doing a string replace.

推荐答案

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

A tag name with a colon in indicates the tag is in a non-default namespace. SimpleXML only looks at one namespace at a time, so you need to specifically select the namespace using the ->children() method.

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

In this case $xml->children('http://www.w3.org/2003/05/soap-envelope')->Body or $xml->children('soap', true)->Body should both work.

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

For this and other reasons, it's not advisable to use print_r to debug SimpleXML objects. Try this dedicated function instead.

相关文章