Feb 09

Dado que ya he hecho un post acerca de como realizar peticiones cURL y otro relacionado con el formateo de XML, sólo me falta lo evidente, un post acerca de como leer y trabajar con los datos XML recibidos. Desde que tenemos la versión 5 del PHP disponemos de la extensión SimpleXML la cual nos proporciona una forma muy rápida y fácil de leer datos XML. Si has programado parsers XML usando librerías como expat encontrarás que esta extensión es una auténtica maravilla, aunque como siempre, a costa de consumir más recursos (básicamente más memoria… pero lo vale).

Con SimpleXML consigues muy fácilmente convertir un archivo XML en un objeto. Para representar la estructura de elementos del documento XML se construye un objeto con atributos q pueden contener directamente valores o arrays de objetos q también tendrán más atributos, más arrays de objetos, etc. (el número de arrays de arrays de objetos depende de los niveles de anidación de los elementos). Se puede trabajar con estos objetos como con cualquier otro en PHP.

Se entiende mucho mejor su uso con un ejemplo sencillo. Imaginemos el siguiente documento XML:

[xml]


Hola
Hola, que tal?


Re: Hola
Bien, gracias.

[/xml]

Asumiendo que en $data tenemos el XML a leer con un código PHP como:

[php] $xml = simplexml_load_string($data);
foreach ($xml->mensaje as $mensaje)
echo $mensaje->texto.’ ‘; [/php]

Obtendremos el resultado:

Hola, que tal? Bien, gracias.

SimpleXML nos puede devolver errores de todo tipo, documentos malformados, problemas de encodings, etc. Si estás en un entorno donde sólo te interesan los documentos válidos y quieres descartar el resto resulta útil algo como:

[php] function loadXML($data) {
$xml = @simplexml_load_string($data);
if (!is_object($xml))
throw new Exception(‘Error en la lectura del XML’,1001);
return $xml;
} [/php]

Si queremos volver a obtener el documento XML dado un objeto SimpleXML es tan fácil como:

[php] echo $xml->asXML(); [/php]

En ocasiones tenemos XML con muchos niveles de elementos y se hace especialmente engorroso ir recorriendo con “foreach” todo el documento. En estas situaciones, como en muchas otras, es necesario poder buscar dentro de los XML. Esto lo conseguimos con el soporte XPath que ofrece SimpleXML. Por ejemplo para acceder a todos los elementos “asunto” del ejemplo anterior:

[php] foreach ($xml->xpath(‘//asunto’) as $asunto)
echo $asunto.”\n”; [/php]

Existen dos consideraciones a tener en cuenta con el uso de SimpleXML:

[1] Si quieres acceder a un elemento que tiene un guión “-” en su nombre debes hacerlo así:

[php] foreach ($xml->{‘mensaje-personal’} as $mensaje)
echo $mensaje->texto.’ ‘; [/php]

Si suponemos que en el ejemplo anterior sustituimos “mensaje” por “mensaje-personal”.

[2] Es recomendable hacer cast a string siempre que obtenemos datos de los objetos SimpleXML. En ocasiones (unexpected :) en lugar de devolver directamente el valor de un elemento devuelve otro objeto SimpleXML, se soluciona con:

[php] $texto = (string) $data_o->mensaje[0]->texto; [/php]

Antes de terminar comento otra característica interesante y es que podemos convertir un objeto SimpleXML en un objeto DOM y viceversa usando las funciones simplexml_import_dom() y dom_import_simplexml(), incluso en las últimas versiones del PHP se le han añadido métodos para poder modificar y crear desde cero documentos XML trabajando directamente con el objeto SimpleXML (al estilo DOM).

Tagged with:
preload preload preload