Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/11/2013, 04:13
Avatar de Tollelle
Tollelle
 
Fecha de Ingreso: enero-2005
Mensajes: 64
Antigüedad: 19 años, 4 meses
Puntos: 0
Sonrisa cURL y parseado XML no legible

Buenos días.

Llevo varios días peleándome con un parseo XML y ya no sé qué más probar...
Si me pudieran aconsejar alguna opción les estaría agradecido.

Estoy consumiendo un WebService mediante cURL y todo funciona como debe.

Código PHP:
Ver original
  1. $headers = array(
  2.   'Content-Type: text/xml; charset=utf-8',
  3.   'SOAPAction: "'.$action.'"',
  4. );
  5.  
  6. /// OPCIONES cURL
  7. $ch = curl_init();
  8.  
  9. $options = array(
  10. CURLOPT_URL             => "$url",
  11. CURLOPT_POST                => true,
  12. CURLOPT_HTTPHEADER      => $headers,
  13. CURLOPT_POSTFIELDS      => $param,
  14. CURLOPT_RETURNTRANSFER  => true,
  15. CURLOPT_CONNECTTIMEOUT  => 10,
  16. CURLOPT_TIMEOUT         => 10, 
  17. CURLOPT_SSL_VERIFYPEER  => false,
  18. );
  19. /// OPCIONES cURL
  20.  
  21. curl_setopt_array($ch, $options);
  22. $respuesta = curl_exec($ch);

Haciendo un var_dump($respuesta) el sistema me devuelve un string con el XML codificado a html tipo htmlentities():

Impresión en pantalla:
Código HTML:
Ver original
  1. <Operaciones><Error><codigo>COD-00000</codigo><mensaje>Mensaje de error del sistema</mensaje></Error></Operaciones>
Código fuente:
Código HTML:
Ver original
  1. &lt;Operaciones&gt;&lt;Error&gt;&lt;codigo&gt;COD-00000&lt;/codigo&gt;&lt;mensaje&gt;Mensaje de error del sistema&lt;/mensaje&gt;&lt;/Error&gt;&lt;/Operaciones&gt;

Este mismo WebService también lo tengo consumido mediante SOAP y no ha habido problema, lo cojo, lo parseo con simplexml_load_string($respuesta) y destripar el XML... pero en este caso no ocurre igual.

No hay forma pasarlo por foreach() para sacar las etiquetas del XML :/ algo que debería ser tan simple como:

Código PHP:
Ver original
  1. $respuesta->Error->mensaje

No funciona...

He probado de todo:

Código PHP:
Ver original
  1. new SimpleXMLElement($respuesta); // Prueba 1
  2. simplexml_load_string($respuesta); // Prueba 2
  3. json_encode($respuesta); // Prueba 3
  4. json_decode($respuesta); //Prueba 3

He verificado si $respuesta es un objeto con is_object($respuesta)

Código PHP:
Ver original
  1. if(!is_object($respuesta)){
  2. echo "NO ES XML";
  3. }else{echo "ES XML";}

Y, como esperaba, new SimpleXMLElement($respuesta) y simplexml_load_string($respuesta) dan como que son XML, pero no hay forma de recorrerlo como hago mediante SOAP.

A alguno de ustedes se le ocurre alguna solución o al menos saber el motivo de por qué no puedo trabajar la respuesta con foreach como hacía con el mismo webservice pero desde soap?

Gracias de antemano.

Un saludo.

Última edición por Tollelle; 14/11/2013 a las 05:04