Leer archivos XML con PHP y SimpleXML

by Jesús -

Debido al trabajo y a la curiosidad claro está, hoy toca hablar de cómo leer los datos XML recibidos con la extensión SimpleXML, disponible en PHP5.

Con SimpleXML es muy fácil convertir un archivo XML en un objeto, y claro está se puede trabajar con estos objetos como con cualquier otro en PHP.

Veamos un ejemplo, con el siguiente archivo XML:

<?xml version='1.0'?>
<messages>
  <message>
    <topic>Trabajo</topic>
    <text>Busco trabajo</text>
  </message>
  <message>
    <topic>Re: Trabajo</topic>
    <text>Yo también.</text>
  </message>
</messages>

Asumimos que en $data tenemos el XML a leer, con el siguiente código php:

$xml = simplexml_load_string($data);
foreach ($xml->message as $message)
echo $message->text.' ';

Con lo que obtenemos:

Busco trabajo Yo también

SimpleXML devuelve errores de todo tipo ya sean documentos malformados o problemas de otro tipo (encoding). En mi caso solo me interesaban los documentos válidos, con lo que los demás podía descartarlos. Podemos hacerlo así:

function loadXML($data) {
  $xml = @simplexml_load_string($data);
  if (!is_object($xml))
    throw new Exception('Error de lectura XML',1001);
  return $xml;
}

Si tenemos un XML con muchos niveles, usar “foreach” resulta un poco engorroso. Podemos utilizar el soporte XPath que ofrece SimpleXML. Por ejemplo para acceder a todos los elementos “topic” del ejemplo anterior, pondríamos:

foreach ($xml->xpath('//topic') as $topic)
echo $topic."\n";

Hay muchos temas de los que hablar sobre este tema como las funciones simplexml_import_dom() y dom_import_simplexml() que nos permiten convertir un objeto SimpleXML en un objeto DOM, pero bueno…otro día será :P