从PHP中的SOAP响应中提取值

时间:2017-01-25 22:57:22

标签: php soap

我需要来自此SOAP响应的值。该值位于loginresponse / return元素中。以下是回复:

<soap-env:envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/">
<soap-env:body soap-env:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:DBCentralIntf-IDBCentral">
    <ns1:loginresponse>
        <return xsi:type="xsd:string"><**THIS IS THE VALUE I NEED**></return>
    </ns1:loginresponse>
</soap-env:body>

以下是我试图解析的方式:

    $response = curl_exec($ch);
    curl_close($ch);

    $xml = simplexml_load_string($response, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/");
    $ns = $xml->getNamespaces(true);
    $soap = $xml->children($ns['SOAP-ENV']);
    $res = $soap->Body->children($ns['NS1']);

    print_r($res->LoginResponse->Return);

但我得到一个空物体。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

请考虑使用PHP SOAP客户端,而不是使用cURL并尝试解析XML响应。 You may need to install PHP SOAP or enable it in your PHP configuration.(我在Windows上使用PHP,所以我只需要在php.ini中取消注释extension=php_soap.dll。)

如果安装了SOAP,则可以从您正在使用的Web服务的提供程序获取WSDL。基于在您显示的XML中使用Google搜索这个值:xmlns:ns1="urn:DBCentralIntf-IDBCentral",我猜你可以找到它here,但你可能会找到更好的运气,因为你肯定知道你是什么网络服务'正在使用。

获得WSDL后,使用PHP SOAP客户端非常简单:

$client = new SoapClient('path/to/your.wsdl');
$response = $client->Login(['username', 'password']);
$theValueYouNeed = $response->loginresponse->return;

答案 1 :(得分:0)

更新: 删除命名空间可以清除一些东西(尽管是黑客)。这是我的新代码:

$response = curl_exec($ch);
curl_close($ch);

$cleanxml = str_ireplace(['SOAP-ENV:', 'SOAP:'], '', $response);
$cleanxml = str_ireplace('NS1:','', $cleanxml);
$xml = simplexml_load_string($cleanxml);

echo $xml->Body->LoginResponse->return[0];