Este grupo de trabajo ha estado mucho tiempo investigando para darle respuesta a tu pregunta, te ofrecemos la respuestas así que deseamos que te sea de mucha apoyo.
Solución:
La siguiente estructura de respuesta SOAP se puede convertir fácilmente en un array utilizando una combinación de los métodos anteriores. Usando solo la función “simplexml_load_string” eliminando los dos puntos “:” devolvió null en algunos casos.
Respuesta SOAP
94567
3958
3
Declinada
202
93815.0
86815.0
0.0
COP
24-07-2015 12:18:40 PM
REJECT
1
VISA
411111
1111
3
Conversión PHP:
$response = preg_replace("/(?)(w+):([^>]*>)/", "$1$2$3", $response);
$xml = new SimpleXMLElement($response);
$body = $xml->xpath('//SBody')[0];
$array = json_decode(json_encode((array)$body), TRUE);
print_r($array);
Resultado:
Array
(
[ns2transaccionResponse] => Array
(
[respuestaTransaccion] => Array
(
[idTransaccion] => 94567
[referencia] => 3958
[idEstado] => 3
[nombreEstado] => Declinada
[codigoRespuesta] => 202
[valor] => 93815.0
[iva] => 86815.0
[baseDevolucion] => 0.0
[isoMoneda] => COP
[fechaProcesamiento] => 24-07-2015 12:18:40 PM
[mensaje] => REJECT
[tarjetaRespuesta] => Array
(
[idFranquicia] => 1
[nombreFranquicia] => VISA
[numeroBin] => 411111
[numeroProducto] => 1111
)
[procesadorRespuesta] => Array
(
[idProcesador] => 3
)
)
)
)
Encontré una solución perfecta para analizar la respuesta SOAP a una matriz:
$plainXML = mungXML( trim($soapXML) );
$arrayResult = json_decode(json_encode(SimpleXML_Load_String($plainXML, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
print_r($arrayResult);
// FUNCTION TO MUNG THE XML SO WE DO NOT HAVE TO DEAL WITH NAMESPACE
function mungXML($xml)
$obj = SimpleXML_Load_String($xml);
if ($obj === FALSE) return $xml;
// GET NAMESPACES, IF ANY
$nss = $obj->getNamespaces(TRUE);
if (empty($nss)) return $xml;
// CHANGE ns: INTO ns_
$nsm = array_keys($nss);
foreach ($nsm as $key)
// A REGULAR EXPRESSION TO MUNG THE XML
$rgx
= '#' // REGEX DELIMITER
. '(' // GROUP PATTERN 1
. '<' // LOCATE A LEFT WICKET
. '/?' // MAYBE FOLLOWED BY A SLASH
. preg_quote($key) // THE NAMESPACE
. ')' // END GROUP PATTERN
. '(' // GROUP PATTERN 2
. ':1' // A COLON (EXACTLY ONE)
. ')' // END GROUP PATTERN
. '#' // REGEX DELIMITER
;
// INSERT THE UNDERSCORE INTO THE TAG NAME
$rep
= '$1' // BACKREFERENCE TO GROUP 1
. '_' // LITERAL UNDERSCORE IN PLACE OF GROUP 2
;
// PERFORM THE REPLACEMENT
$xml = preg_replace($rgx, $rep, $xml);
return $xml;
// End :: mungXML()
Te dará un perfecto array de datos XML SOAP.
finalmente encontré que la solución es
podemos obtener el cuerpo de la respuesta de SOAP de las siguientes formas
Ejemplo 1:
$xml = new SimpleXMLElement($soapResponse);
foreach($xml->xpath('//soap:body') as $header)
$output = $header->registerXPathNamespace('default', 'http://FpwebBox.Fareportal.com/Gateway.asmx');
ejemplo2:
$doc = new DOMDocument('1.0', 'utf-8');
$doc->loadXML( $soapResponse );
$XMLresults = $doc->getElementsByTagName("SearchFlightAvailability33Response");
$output = $XMLresults->item(0)->nodeValue;
Comentarios y puntuaciones
Si te gustó nuestro trabajo, puedes dejar una noticia acerca de qué te ha parecido esta sección.