Solución:
La sugerencia de bksi no es tan incorrecta, sin embargo, técnicamente, como se trata de XML, solo necesita acceder correctamente a los elementos con espacios de nombres. Esto funciona más fácilmente usando una expresión XPath y registrando namspace-uri en su propio prefijo:
$soap = simplexml_load_string($soapXMLResult);
$soap->registerXPathNamespace('ns1', 'http://ivectorbookingxml/');
$test = (string) $soap->xpath('//ns1:SearchResponse/ns1:SearchResult/ns1:SearchURL[1]')[0];
var_dump($test);
Producción:
string(100) "http://www.lowcostholidays.fr/dl.aspx?p=0,8,5,0&date=10/05/2013&duration=15&room1=2,1,0_5®ionid=9"
Si no desea utilizar XPath, debe especificar el espacio de nombres mientras recorre, solo los hijos en el espacio de nombres del elemento en sí están disponibles directamente si el elemento en sí no tiene prefijos. Como el elemento raíz tiene el prefijo, primero debe recorrer hasta la respuesta:
$soap = simplexml_load_string($soapXMLResult);
$response = $soap->children('http://schemas.xmlsoap.org/soap/envelope/')
->Body->children()
->SearchResponse
;
Entonces puedes hacer uso de la $response
variable como la conoce:
$test = (string) $response->SearchResult->SearchURL;
porque ese elemento no tiene prefijo. Como se devuelve un resultado más complejo, este es probablemente el mejor porque puede acceder fácilmente a todos los valores de respuesta.
Tu pregunta es similar a:
- Analizar CDATA desde una respuesta SOAP con PHP
Quizás el código / descripciones también sean útiles.
Podría considerar pasar la respuesta SOAP a través de un documento DOM y luego convertirlo en un objeto simplexml.
<?php
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($soap_response);
libxml_clear_errors();
$xml = $doc->saveXML($doc->documentElement);
$xml = simplexml_load_string($xml);
$response = $xml->body->envelope->body->searchresponse;
//print_r($response); exit;
echo $response->searchresult->returnstatus->success;
echo '<br>';
echo $response->searchresult->searchurl;
?>
Sin embargo, esto puede causar problemas con caracteres especiales en su respuesta, como é y à. De lo contrario, funciona.
Otra solución, la única solución que funcionó para mí:
$xml = $soap_xml_result;
$xml = preg_replace("/(</?)(w+):([^>]*>)/", '$1$2$3', $xml);
$xml = simplexml_load_string($xml);
$json = json_encode($xml);
$responseArray = json_decode($json, true); // true to have an array, false for an object
print_r($responseArray);
Disfrutar 🙂