I’m receiving through cUrl an XML generated with PHP with this code:
$c = curl_init("http://www.domain.com/script.php");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$xmlstr = curl_exec($c);
If I echo the $xmlstr variable it shows the following:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<XGetPasoParadaREGResponse xmlns="http://tempuri.org/">
<XGetPasoParadaREGResult>
<PasoParada><cabecera>false</cabecera>
<e1>
<minutos>1</minutos>
<metros>272</metros>
<tipo>NORMAL</tipo>
</e1>
<e2>
<minutos>7</minutos>
<metros>1504</metros>
<tipo>NORMAL</tipo>
</e2><linea>28
</linea>
<parada>376</parada>
<ruta>PARQUE ALCOSA</ruta>
</PasoParada>
</XGetPasoParadaREGResult><status>1</status></XGetPasoParadaREGResponse>
</soap:Body>
</soap:Envelope>
Which is correct and the same generated at the script. However, if I try to do the following
$xml = simplexml_load_string($xmlstr);
if (!is_object($xml))
throw new Exception('Reading XML error',1001);
echo $xml->e1->minutos;
Doesn’t show anything and print_r the object prints an empty object. What could be wrong?
You have two main problems, firstly you aren’t taking into account any namespaces (e.g.
soap) and secondly you aren’t traversing the XML hierarchy to get at the desired element.The “simple” way would be:
You could also make an XPath query for the value:
For what it is worth, the PHP Manual contains basic usage examples covering how to traverse the XML structure and the specific pages for
children()andregisterXPathNamespace()show you how to work with namespaced elements with examples.Finally, as you have seen, the output from
print_r()/var_dump()with SimpleXML is not always very helpful at all! The best way to see what you’ve got is to echosaveXML()which will display the XML for a given element.