解析SOAP响应PHP

时间:2017-02-08 09:14:58

标签: php xml parsing soap

我有一个我想解析的SOAP响应,但是我似乎遇到了错误。

SOAP响应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ValidateNewUserResponse xmlns="urn:websitea.com/v2"><ValidateNewUserResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Message i:nil="true"/>
<Status>true</Status>
<FailureReason>None</FailureReason>
<IdentityValidationOutcome>0</IdentityValidationOutcome>
<ValidationIdentifier>112244</ValidationIdentifier>
</ValidateNewUserResult></ValidateNewUserResponse>
</s:Body>
</s:Envelope>

我尝试过以下代码:

$doc = new DOMDocument();
$doc->loadXML($strXml);
echo $doc->getElementsByTagName('Status')->item(0)->nodeValue;

这会产生以下错误:

  

尝试获取非对象的属性

我也尝试过以下代码:

$get_xml = str_ireplace(['S-ENV:', 'S:'], '', $strResponse);
$xml = simplexml_load_string($get_xml);
$status=((string)$xml->Body->ValidateNewUserResponse->ValidateNewUserResult->Status);echo "<br />";

产生以下错误:

  

simplexml_load_string():名称空间错误:未定义消息的名称空间前缀i for nil

3 个答案:

答案 0 :(得分:0)

尝试以下操作,对我来说很好。

$doc = new DOMDocument();
$doc->loadXML($strResponse);
$result = $doc->getElementsByTagName('Status')->item(0)->nodeValue;
echo $result;

答案 1 :(得分:0)

如果XML字符串已损坏或未正确转义并且您使用双引号,则会收到错误。测试你的代码,以下对我有用(使用单引号):

$strXml = '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<ValidateNewUserResponse xmlns="urn:websitea.com/v2"><ValidateNewUserResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Message i:nil="true"/>
<Status>true</Status>
<FailureReason>None</FailureReason>
<IdentityValidationOutcome>0</IdentityValidationOutcome>
<ValidationIdentifier>112244</ValidationIdentifier>
</ValidateNewUserResult></ValidateNewUserResponse>
</s:Body>
</s:Envelope>';

$doc = new DOMDocument();
$doc->loadXML($strXml);
echo $doc->getElementsByTagName('Status')->item(0)->nodeValue;

答案 2 :(得分:-1)

或者你可以使用WSDL到php生成器,因此你不必解析XML响应,也不必生成XML请求,因为你总是处理PHP对象。这是使用基本本机PHP SoapClient类的情况。您还可以使用WSDL到php生成器,例如PackageGenerator,因为它是我视角下使用SOAP的最佳方式