1

I'm using cURL to POST a SOAP request. The response is as follows:

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

I use this to decode:

$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 />'; } 

I'm having trouble decoding this with SimpleXML. This link seems most relevant to my situation but I'm unable to apply it to my case as the simpleXML element just

Warning: SimpleXMLElement::children() [simplexmlelement.children]: Node no longer exists in C:\.php on line 33 /*(line with the for each statement)*/ 

Any suggestions?

UPDATE: If the server responds with the following error, how would I detect it..?

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

1 Answer 1

4

Variable and property names are case sensitive and while I was testing it, it turned out there's other stuff as well. The following works:

$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 />'; } 

To answer the updated question:

$fault = $soap->Body->children($ns['env']); if (isset($fault->Fault)) { // Handle error } 
Sign up to request clarification or add additional context in comments.

5 Comments

would appreciate it if you could respond to the updated Question as well..Thanks
How would I reach the latitude/longitude properties?
Got it! echo (string) $item->currentLocation->latitude
The same way you reach Body, Fault, etc. Get the children of it's parent node, e.g. $currentLocation = $item->currentLocation->children(); echo $currentLocation->latitude;
Wish I could give multiple ups! Thanks again.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.