Я использую cURL для отправки запроса SOAP. Ответ следующий:
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> <wsa:To>http://www.w3.org/2005/08/addressing/anonymous</wsa:To> <wsa:Action>http://www.csapi.org/schema/parlayx/common/v3_1/TerminalLocationPort/getLocationForGroupResponse</wsa:Action> </env:Header> <env:Body> <ns2:getLocationForGroupResponse xmlns:ns2="http://www.csapi.org/schema/parlayx/terminal_location/v3_1/local"> <ns2:result> <address>234983</address> <reportStatus>Retrieved</reportStatus> <currentLocation> <latitude>12.5665</latitude> <longitude>43.7708</longitude> <timestamp>2012-01-03T17:06:16.805+01:30</timestamp> </currentLocation> </ns2:result> <ns2:result> <address>423903</address> <reportStatus>Retrieved</reportStatus> <currentLocation> <latitude>12.2165</latitude> <longitude>43.6518</longitude> <timestamp>2012-01-03T17:06:16.824+01:30</timestamp> </currentLocation> </ns2:result> </ns2:getLocationForGroupResponse> </env:Body> </env:Envelope>
Я использую это для декодирования:
$err = curl_error($soap_do); $result = curl_exec($soap_do); $xml = simplexml_load_string($result); $ns = $xml->getNamespaces(true); $soap = $xml->children($ns['env']); $getaddressresponse = $soap->body->children($ns['ns2']); foreach ($getaddressresponse->children() as $item) { echo (string) $item->address . '<br />'; }
У меня проблемы с расшифровкой этого с помощью SimpleXML. Эта ссылка кажется наиболее актуальной для моей ситуации, но я не могу применить ее к моему делу, поскольку элемент simpleXML просто
Warning: SimpleXMLElement::children() [simplexmlelement.children]: Node no longer exists in C:\.php on line 33 /*(line with the for each statement)*/
Какие-либо предложения?
ОБНОВЛЕНИЕ: Если сервер отвечает со следующей ошибкой, как бы я ее обнаружил ..?
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> <wsa:To>http://www.w3.org/2005/08/addressing/anonymous</wsa:To> <wsa:Action>http://www.w3.org/2005/08/addressing/fault</wsa:Action> </env:Header> <env:Body> <env:Fault> <faultcode>env:Server</faultcode> <faultstring>Service Exception</faultstring> <detail> <ns1:ServiceException xmlns:ns1="http://www.csapi.org/schema/parlayx/common/v3_1" xmlns:ns2="http://www.csapi.org/schema/parlayx/terminal_location/v3_1/local"> <messageId>SVC004</messageId> <text>Trip not Found for this MSISDN</text> </ns1:ServiceException> </detail> </env:Fault> </env:Body> </env:Envelope>
Имена переменных и свойств чувствительны к регистру, и пока я его тестировал, оказалось, что есть и другие вещи. Следующие работы:
$soap = $xml->children($ns['env']); $getaddressresponse = $soap->Body->children($ns['ns2']); foreach ($getaddressresponse->getLocationForGroupResponse->children($ns['ns2']) as $item) { $item = $item->children(); echo $item->address . '<br />'; }
Чтобы ответить на обновленный вопрос:
$fault = $soap->Body->children($ns['env']); if (isset($fault->Fault)) { // Handle error }