How to parse SOAP XML? How to parse SOAP XML? xml xml

How to parse SOAP XML?


One of the simplest ways to handle namespace prefixes is simply to strip them from the XML response before passing it through to simplexml such as below:

$your_xml_response = '<Your XML here>';$clean_xml = str_ireplace(['SOAP-ENV:', 'SOAP:'], '', $your_xml_response);$xml = simplexml_load_string($clean_xml);

This would return the following:

SimpleXMLElement Object(    [Body] => SimpleXMLElement Object        (            [PaymentNotification] => SimpleXMLElement Object                (                    [payment] => SimpleXMLElement Object                        (                            [uniqueReference] => ESDEUR11039872                            [epacsReference] => 74348dc0-cbf0-df11-b725-001ec9e61285                            [postingDate] => 2010-11-15T15:19:45                            [bankCurrency] => EUR                            [bankAmount] => 1.00                            [appliedCurrency] => EUR                            [appliedAmount] => 1.00                            [countryCode] => ES                            [bankInformation] => Sean Wood                            [merchantReference] => ESDEUR11039872                        )                )        ))


PHP version > 5.0 has a nice SoapClient integrated. Which doesn't require to parse response xml. Here's a quick example

$client = new SoapClient("http://path.to/wsdl?WSDL");$res = $client->SoapFunction(array('param1'=>'value','param2'=>'value'));echo $res->PaymentNotification->payment;


In your code you are querying for the payment element in default namespace, but in the XML response it is declared as in http://apilistener.envoyservices.com namespace.

So, you are missing a namespace declaration:

$xml->registerXPathNamespace('envoy', 'http://apilistener.envoyservices.com');

Now you can use the envoy namespace prefix in your xpath query:

xpath('//envoy:payment')

The full code would be:

$xml = simplexml_load_string($soap_response);$xml->registerXPathNamespace('envoy', 'http://apilistener.envoyservices.com');foreach ($xml->xpath('//envoy:payment') as $item){    print_r($item);}

Note: I removed the soap namespace declaration as you do not seem to be using it (it is only useful if you would use the namespace prefix in you xpath queries).