我有一个我想解析的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
答案 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的最佳方式