Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] cURL y parseado XML no legible

Estas en el tema de cURL y parseado XML no legible en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 14/11/2013, 04:13
Avatar de Tollelle  
Fecha de Ingreso: enero-2005
Mensajes: 64
Antigüedad: 19 años, 3 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
  #2 (permalink)  
Antiguo 14/11/2013, 08:22
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: cURL y parseado XML no legible

Si está codificado con htmlentities usa html_entity_decode para parsear con simpleXML:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $xml = '&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;';
  4. $sxe = new SimpleXMLElement(html_entity_decode($xml));
  5. echo $sxe->Error->mensaje; //Mensaje de error del sistema
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #3 (permalink)  
Antiguo 14/11/2013, 08:37
Avatar de Tollelle  
Fecha de Ingreso: enero-2005
Mensajes: 64
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: cURL y parseado XML no legible

Gracias por el aporte, también lo intenté y nada...

Detalle curioso:

Al hacer un var_dump($respuesta) sobre lo que me devuelve tal cual el webservice obtengo lo siguiente:
Código PHP:
Ver original
  1. string(619) "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header/><soapenv:Body><trataPeticionPagoResponse xmlns="http://webservices.tpvpc.sermepa.es"><trataPeticionPagoReturn>&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;</trataPeticionPagoReturn></trataPeticionPagoResponse></soapenv:Body></soapenv:Envelope>"
Nótese que hay xml a pelo y xml codificado a entities... 0_o

Lo que no consigo es obtener el <trataPeticionPagoReturn> para pasarle el html_entity_decode() a su contenido y así poder leerlo como objeto... :/

El mismo webservice consumido desde SOAP con PHP me devuelve lo siguiente al hacer un var_dump($respuesta) en XML sin problemas:
Código PHP:
Ver original
  1. object(stdClass)#3 (1) {
  2.  ["trataPeticionPagoReturn"]=>
  3.   string(123) "COD-00000Mensaje de error del sistema"
  4. }

En cURL haciendo un var_dump(simplexml_load_string(html_entity_decode( $respuesta))) me tira:
Código PHP:
Ver original
  1. object(SimpleXMLElement)#1 (0) {
  2. }

Gracias de todas formas.
  #4 (permalink)  
Antiguo 14/11/2013, 09:14
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: cURL y parseado XML no legible

No siempre SimpleXML te va a devolver la estructura completa con un var_dump o print_r y debes saber utilizar los métodos en estos casos:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header/><soapenv:Body><trataPeticionPagoResponse xmlns="http://webservices.tpvpc.sermepa.es"><trataPeticionPagoReturn>&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;</trataPeticionPagoReturn></trataPeticionPagoResponse></soapenv:Body></soapenv:Envelope>';

Código PHP:
Ver original
  1. $sxe = new SimpleXMLElement(html_entity_decode($xml));
  2. $body = $sxe->children('soapenv', true)->Body->children('', true);
  3. echo $body->trataPeticionPagoResponse->trataPeticionPagoReturn->Operaciones->Error->mensaje;
  4. //Mensaje de error del sistema
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 14/11/2013, 10:05
Avatar de Tollelle  
Fecha de Ingreso: enero-2005
Mensajes: 64
Antigüedad: 19 años, 3 meses
Puntos: 0
Respuesta: cURL y parseado XML no legible

andresdzphp muchas gracias.

Ahora sí puedo recorrer a mi antojo el xml :)

Gracias ;)

Etiquetas: curl, soap, string, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:30.