如何将SOAP响应转换为XML或JSON格式?

5
<soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:body>
        <ns1:mbillcommandresponse xmlns:ns1="http://www.mysoap.com/SoapService/">
            <ReturnValues>
                <name>status</name>
                <value>TEHNICAL_ERROR</value>
            </ReturnValues>
            <ReturnValues>
                <name>description</name>
                <value>Please contact your administrator</value>
            </ReturnValues>
        </ns1:mbillcommandresponse>
    </soapenv:body>
</soapenv:envelope>

我在CURL响应中获得了以上内容。这是我的PHP代码:

    $response = curl_exec($ch);
    $xml = simplexml_load_string($response);
    //$result = $xml->xpath('//name'); //echo "<pre>"; print_r($result); exit;
    $xml->registerXPathNamespace('ns1', 'http://www.mysoap.com/SoapService/');
    foreach ($xml->xpath('//returnvalues') as $item) {
        $json = json_encode($item);
        $convrt_arr = json_decode($json, true);
        break;
    }
    print_r($json); exit;

在我上述的代码中,我得到了一个空的json。你能帮忙看看吗?

2
顺便提一下,Soap是一种XML格式,但是有一些特殊的库,比如ext/soap,可以处理它。 - ThW
2
无法重现问题。在我的机器上打印出 {"name":"status","value":"TEHNICAL_ERROR"} - Marco
@SupunPraneeth 我已经发布了我的SOAP响应数据。你可以在那里检查我的returnvalues数据。 - Chinmay235
1
为什么不使用标准的SoapClient而是使用CURL呢?这样你就可以直接将答案转换为PHP对象(前提是你提供了类型映射)。有了SOAP Web服务的地址,你可以通过像https://github.com/wsdl2phpgenerator/wsdl2phpgenerator这样的库来完成所有必要的工作。 - Daniel Protopopov
代码没有错误,可以查看结果:https://3v4l.org/322K6 - Chetan Ameta
显示剩余2条评论
2个回答

2
你的问题编辑是一个很大的线索。你将XML从小写元素改为驼峰式元素。请更改为:
foreach ($xml->xpath('//returnvalues') as $item) {

to:

foreach ($xml->xpath('//ReturnValues') as $item) {

只要按照格式要求编写,就可以正常工作。XPath查询区分大小写。


相当好奇——为什么要点踩?如果$response的值符合开发者的预期,那么他的代码生成的结果也会不同。 - jstur
谢谢您的回答。我的代码是正确的。我已经编辑了我的问题。您能否请检查并修改您的答案? - Chinmay235
没问题。编辑完成。 - jstur

0
希望这能有所帮助。
$response = '<soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:body>
        <ns1:mbillcommandresponse xmlns:ns1="http://www.mysoap.com/SoapService/">
            <returnvalues>
                <name>status</name>
                <value>TEHNICAL_ERROR</value>
            </returnvalues>
            <returnvalues>
                <name>description</name>
                <value>Please contact your administrator</value>
            </returnvalues>
        </ns1:mbillcommandresponse>
    </soapenv:body>
</soapenv:envelope>';
$response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response);

$xml = new SimpleXMLElement($response);
$body = $xml->xpath('//returnvalues');
$json = json_encode((array)$body); 
print_r($json);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接