Bienvenido a mi sitio. Como te habrás dado cuenta, mi nombre es Bruno y soy un desarrollador web que vive en Buenos Aires, Argentina. Este es un espacio para compartir ideas de todo tipo, sentite libre de opinar. Cualquier cosa que quieras decirme, escribime.

PHP y XML van de la mano

2007.03.02

Hace unos días leí en Digital Web, una revista online dedicada al tema del desarrollo web, un artículo que me pareció genial. El artículo original, escrito por Kerri Hicks, está en inglés y su autora me dio permiso para la traducción y publicación en este sitio. Es una buena lectura porque trata de una problemática que hasta hace unos meses no tenía una solución sencilla. Estoy hablando de la comunicación entre PHP y XML.

Me pareció interesante este artículo porque está dedicado tanto al programador experto que ya utilizaba anteriormente otras herramientas, y también es bueno para el que recién se inicia. De todas formas es importante leerlo y saber las herramientas de las que podemos hacer uso. A continuación, la traducción del artículo:


Existen muchas formas de almacenar, trabajar y obtener información en la web. Simples bases de datos, bases de datos relacionales, XML, aún archivos de texto plano pueden guardar nuestro catálogo de productos, información de usuarios y otros repositorio de cosas importantes que queramos compartir con el mundo. Hay algunas formas lógicas de trabajar con distintos tipos de datos. Por ejemplo, mucha gente que usa el motor MySQL para almacenamiento, crea scripts en PHP para trabajar con esos datos, por el soporte nativo que tiene este de las bases de datos de MySQL. Por otro lado, los puristas del XML, generalmente usan XSLT (que en sí mismo es también XML) para trabajar con sus archivos correctamente formateados. Como desarrolladores web, generalmente tenemos que tomar nosotros la decisión de cómo almacenar nueva información, y aún más importante, cómo trabajar con esa información que el cliente nos brinda.

XML continúa ganando popularidad en la web como formato de datos, mientras que las bases de datos como MySQL consistentemente están mejorando y tienen una base de usuarios que no para de crecer. Tanto XML y MySQL te permiten representar tu información con pares clave/valor. Por ejemplo, digamos que querés expresar el hecho que el título de tu disco favorito es Me Gustan las Vacas. La expresión de XML <titulo>Me Gustan las Vacas</titulo>
puede ser usada de la misma forma que el comando de MySQL INSERT INTO tabla (titulo) VALUES ('Me Gustan las Vacas'). Ambas construcciones te dejan almacenar la información como el hecho que Me Gustan las Vacas es un título.

XML te ofrece un documento en forma de árbol el cual le da una estructura a tu información, XSLT transforma esa información para el envío de datos, y los parsers quedan para la visualización. Por otro lado, la mayoría de los usuarios de MySQL, usan el poder de las funciones en PHP o cualquier otro lenguaje de scripting para crear relaciones entre tablas, campos y valores.

Generalmente no existe una forma correcta de guardar y mostrar tu información, y hablando pragmáticamente, la mejor forma es generalmente elegir la que más conoces y sabés que te funciona. Sin embargo, PHP5 ha traído consigo una nueva funcionalidad, SimpleXML, que puede ofrecerte aún más opciones, y eso es un adicional poderoso para tus habilidades de scripting.

¿Por qué elegir?

Algunos años atrás, necesita reutilizar algunos documentos XML que tenía por ahí y un poco de información guardada en una base de datos de MySQL. Todo esto lo necesitaba combinar en un solo archivo PHP. Luego de varias noches de probar con extensiones para XML y escribir expresiones regulares realmente feas, pude hacerlo funcionar. Pero era una solución muy poco elegante o mantenible, y francamente, muy costosa de programar.

Ahora que PHP y XML van de la mano, cobra mucho sentido usarlos juntos cuando sea necesario.

Si hubiese estado disponible SimpleXML en ese entonces, el proyecto habría sido mucho más fácil. Al usar SimpleXML en PHP podés agarrar un pedazo de XML y convertirlo en un objeto en PHP, lo cual se segmenta más aún, transformando los elementos de XML en propiedades de objetos con los cuales PHP puede trabajar después. Múltiples elementos XML del mismo tipo se representan como un arreglo, el cual podés iterar tanto como quieras con foreach o while.

El concepto básico

Voy a ilustrar el concepto básico usando una simple lista de compras conteniendo XML que podés crear vos mismo (¿qué, vos no hacés tu lista de compras en XML?). Recordá, con XML podés crear tus propios nombres de elementos y funcionarán bien mientras te mantengas consistente y los encajes correctamente.


<?xml version="1.0"?> 
  <listaCompras> 
      <listaNombre>Mi Lista de Compras</listaNombre>
      <grupoComida>
          <grupoNombre>Frutas y Vegetales</grupoNombre>
          <item>
              <nombre>Pomelo</nombre>
              <cuantos>2</cuantos>
          </item>
          <item>
              <nombre>Zanahorias</nombre>
              <cuantos>1 kilo</cuantos>
          </item>
      </grupoComida>
      <grupoComida>
          <grupoNombre>Granos</grupoNombre>
          <item>
              <nombre>Arroz</nombre>
              <cuantos>3 kilos</cuantos>
          </item>
      </grupoComida> 
      <grupoComida>
          <grupoNombre>Golosinas</grupoNombre>
          <item>
              <nombre>Caramelos</nombre>
              <cuantos>1 bolsa</cuantos>
          </item>
      </grupoComida> 
  </listaCompras>

En español simple, tenemos tres grupos de comidas: Frutas y Vegetales, Granos y Golosinas. Además de un nombre, cada uno de los grupos también contiene uno o más ítems y cada ítem contiene un nombre y una cantidad. Bastante simple.

Ahora escribiremos el PHP necesario que nos va a permitir tomar la información del XML y usarla en un script.


<?php 
  // guardo el nombre del archivo XML en un string
  $miListaCompras = "compras.xml";

  // cargo el archivo XML
  $xml = @simplexml_load_file($miListaCompras) or die ("no se puede cargar"); 

  // asigno el elemento listaNombre a un string
  $nombreListaCompras = $xml->listaNombre;

  echo "<h1>Lista: $nombreListaCompras</h1>";
?>

El pedazo de código anterior devuelve: Lista: Mi Lista de Compras.

No se vuelve mucho más complicado que esto. El script lee el archivo XML y lo carga completo en un objeto llamado $xml para luego recorrerlo y encontrar un elemento llamado listaNombre. Asigna el valor del elemento de XML listaNombre (en nuestro caso “Mi Lista de Compras”) a la variable $nombreListaCompras, y luego se puede usar esa variable en cualquier lugar que permita PHP.

Usando tu información

Ahora que el archivo XML está cargado en un objeto y ya aprendimos a mostrar valores simples, se pueden hacer cosas más complejas e interesantes. Creemos un ciclo que tome cada elemento de grupoComida, muestre su nombre y luego liste los nombres y cantidades de cada uno de los items que contiene:


foreach ($xml->grupoComida as $grupoComida) 
{
  echo "<h2>El nombre del grupo de comida es: $grupoComida->grupoNombre</h2>";
  foreach ($grupoComida->item as $item) 
  {
      echo "<br /> Item: $item->nombre";
      echo "<br /> Cantidad: $item->cuanto";
      echo "<br />";
  }
  echo "<br />";
}

Lo anterior devuelve:


Lista: Mi Lista de Compras
El nombre del grupo de comida es: Frutas y Vegetales
Item: Pomelo
Cantidad: 2
Item: Zanahorias
Cantidad: 1 kilo
El nombre del grupo de comida es: Granos
Item: Arroz
Cantidad: 3 kilos
El nombre del grupo de comida es: Golosinas
Item: Caramelos
Quantity: 1 bolsa

Si ya sos un experto con consultas XML, te alegrará saber que SimpleXML también soporta XPath

Otras aplicaciones

Como XHTML es un subconjunto de XML, podés usar SimpleXML para parsear información de cualquier sitio web que tenga XHTML bien formado. No me alcanzan las palabras para destacar lo bueno que es poder mantener un archivo principal de simple información en XHTML, y luego poder moverlo, cambiarlo y modificar la forma en que se muestra la información con un poco de PHP, mientras que al mismo tiempo esté disponible para que otras personas lo usen en sus proyectos particulares. Para lograr esto con un archivo XHTML bien formado de cualquier lugar de la web, simplemente utilizá una URI en vez del nombre del archivo en la función simplexml_load_file de esta forma:


// guardo en un string de PHP la URI del archivo XML
$listaDeJuan = "http://www.listasdejuan.com/list.xml"; 

// cargo el archivo XML
$xml = @simplexml_load_file($listaDeJuan) or die ("no se puede cargar el archivo");

Esto se vuelve realmente útil cuando querés usar información de algunos servicios web que sirven respuestas en formato XML. Un buen ejemplo es ISBNdb, un servicio de datos de libros. Su API realmente sencilla te permite obtener información de libros y te la entrega (o a tu script PHP) en formato XML. Fijate un segundo en este ejemplo — pero recordá volver acá para terminar de leer.

Avanzá, mejorá e iterá

Ahora que ya entendiste el poder de SimpleXML y el funcionamiento básico, querrás considerar nuevas formas para almacenar los datos que usarás para tus proyectos. Un trabajo producto requiere muchas veces del poder y versatilidad de una base de datos, pero para algunas aplicaciones, SimpleXML es una solución fantástica.

Comentarios

pfff increíble explicación de como leer un archivo xml para recoger la información que quieras y usarla en una nueva página web. La verdad es que me he desesperado después de preguntar a mucha gente y buscar por google lo que quería.
Felicidades por la explicación, que creo a muchos webmasters les interesaría.

Escrito por oriol | 2007.03.22 23:18:14

Simplemente buenisimo.

Escrito por DaoS | 2007.04.20 15:59:23

Muy buena explicacion. Felicidades

Escrito por paisleones | 2007.04.28 14:29:04

Gracias!!!! me sirvio de mucho la informacion aqui presentada

Escrito por Indalecio | 2007.05.16 18:19:27

Gracias!!!!!!!!!!!!!!!!! Me sirvio muchisimo la informacion

Escrito por Diana | 2007.05.17 17:08:25

Entendi el articulo totalmente..pero tengo una duda...si tengo un archivo csv con datos que corresponden a una categoria como puedo sacar esos datos...son 5 mil datos..pero solo debo mostrar uno segun solicitud.

Escrito por mil | 2007.07.11 14:05:47

Esto sirve solamente para archivos XML. Primero tendrías que convertir el archivo y lamentablemente después deberías iterar por todos los nodos hasta encontrar el que te sirve. Es algo secuencial.

Gracias a todos por sus comentarios.

Escrito por Bruno | 2007.07.11 15:21:44

He estado investigando la funcionalidad de xml para poder crear bases de datos con este formato, mi pregunta es, si se puede recorrer un archivo xml pasándolo como objeto en php, es posible hacer consultas a mas de 2 archivos xml como una consulta sql...

te agradecería mucho que me pudieras ayudar en este tema

Escrito por arasfer | 2007.07.20 15:44:51

Arasfer, mirá, no estoy seguro pero supongo que no podría hacerse tan fácilmente. Si tenés 2 archivos XML que los pasás como objeto entonces tendrías también 2 instancias separadas.

Quizás podrías crear una clase que haga la funcionalidad que vos necesitás, pero imagino que siempre sería algo "manual". Es decir, primero uno y después el otro.

Escrito por Bruno | 2007.07.22 21:58:32

normalmente no doy comentarios a las guias, pero esta guia es perfecta, esta demasiado bueno, muchisimas gracias, gracias a ella pude agregar anuncios remotos a mi software :)
salu2

Escrito por juan pablo | 2007.10.27 12:10:37

Comentarios cerrados