2017-02-08 14 views
2

У меня есть ответ SOAP, который я пытаюсь разобрать, однако, похоже, я получаю сообщение об ошибке.Анализ SOAP-ответа PHP

ответ 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; 

Это производит следующее сообщение об ошибке:

Trying to get property of non-object

Я также попытался следующий код:

$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(): namespace error : Namespace prefix i for nil on Message is not defined

+0

Возможный дубликат (http://stackoverflow.com/questions/26467445/domdocument-simple-getelementsbytagname -wont работа) –

ответ

0

Попробуйте следующее, отлично работает для меня.

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

Или вы можете использовать WSDL для PHP генератора, так что вам не придется разобрать ответ XML, ни создания запроса XML, как вы всегда будете обрабатывать объекты PHP. В этом случае используется базовый класс PHP SoapClient. Вы также можете использовать WSDL для php-генератора, например PackageGenerator, потому что это лучший способ потребления SOAP в моей точке зрения.

0

Вы получите сообщение об ошибке, если строка XML повреждена или неправильно экранирована, и вы использовали двойные кавычки. Тестирование кода, следующий работал для меня (используя одинарные кавычки): [? DOMDocument простой GetElementsByTagName не будет работать]

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