jueves, 14 de julio de 2011

Parsear ficheros XML grandes

Cuando tenemos que integrarnos con servicios de terceros, lo más normal es que intercambiemos la información en formato XML o JSON (esto se está poniendo de moda últimamente). Con PHP4, parsear XML es poco menos que un suplicio, pero con PHP5 la cosa cambia.
Disponemos de la extensión SimpleXML que, de forma muy sencilla, nos permite indicar un XML de entrada y lo tendremos cargado en un bonito y accesible objeto.
Sin embargo, esta solución no es viable cuando vamos a procesar XML de gran tamaño, ya que estaríamos cargando toda la información en memoria. Normalmente no será necesario, ya que lo que se suele hacer es recorrer el XML buscando alguna información concreta, o bien convertirlo a otro formato o cargarlo en nuestra base de datos.
Para este tipo de operaciones es mejor usar la extensión XMLReader. Su funcionamiento es parecido al de un cursor que va recorriendo el XML. Por tanto, al no parsearlo entero, el consumo de memoria es mucho menor.
Vistas estas dos alternativas (hay algunas más), a la hora de procesar un XML entero una buena solución puede ser combinar ambos métodos. Es decir, usar XMLReader para ir recorriendo los nodos e ir cargando cada uno de ellos con SimpleXML, para que el manejo de la información contenida sea trivial.
Sería algo así:
Fuente: http://stackoverflow.com/questions/1835177/how-to-use-xmlreader-in-php

viernes, 8 de julio de 2011

Códigos de países, provincias y ciudades

Buscando información sobre listados de localidades me he encontrado este post de Carme Pla en el que parece estar trabajando en algo parecido y comparte su experiencia.
Los ficheros que encuentro más interesantes son:
Pero, sin duda, el gran descubrimento ha sido la web GeoNames, en la que podemos encontrar listados de prácticamente todas las localidades del mundo, y con licencia Creative Commons. Desde luego un gran trabajo que se merece una donación.
Sobre todo, es importante usar códigos más o menos estandarizados, porque siempre nos será más fácil integrarnos con servicios que empleen la misma estandarización y nos ahorraremos pasos de traducción de identificadores. Si no fuera así, mi recomendación es usar siempre un sistema de identificadores interno, que se ajuste a nuestro modelo de datos y que no dependa de ningún proveedor (porque luego lo cambias por otro y te quedas con el "culo al aire" y mucho código que cambiar).