Parsear Xml en Android con SimpleXml

El caso que parsear xml en Android puede suponer más de un quebradero de cabeza eso es lo que me he encontrado precisamente estos días, al intentar usar clases standares de Java para lograrlo me saltaba el error que la clase no era compatible con las de Apache Harmony. Recordemos que Android usa Dalvik y aunque tiene un soporte inmenso en las librerías de Java, esta adaptado y pensado para correr en un dispositivo móvil y por estas razones no todo el núcleo esta completo.

Otras posibilidades sería hacerlo funcionar con SAX o DOM, SAX es más ligero al no construir todo el árbol XML como si lo hace DOM. Es decir DOM ocupara más memoria que SAX pero nos permitirá navegar por la estructura del XML. Normalmente si recibes una respuesta de un webservices, con SAX tienes más que suficiente.

En este caso pretendía usar XML como persistencia del programa Android, con las ventajas de poderlo exportar/importar, etc. Dom se ajustaba al perfil al poder recorrer el árbol en XML y luego editar o añadir un item, pero no esta soportado en Android, recordemos que es el más lento y en la mayoría de casos que necesitamos parsear un XML de  una fuente externa con SAX o XMLPULL nos basta y son eficientes.

Para este proyecto he encontrado ideal el framework de XML llamado Simple XML Serialization.

Nos ponemos manos a la obra para esto seguiremos un ejemplo para realizar la extracción de datos de un servidor xml para este caso usaremos el servidor www.lamevaip.info donde podemos encontrar los datos de nuestra conexión la estructura xml es de la siguiente forma.

http://www.lamevaip.info/index.php/xml:

<lamevaip>
<utc>2012-04-29 18:18:14</utc>
<ip>178.79.86.160</ip>
<country>XX</country>
<agent>
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.5 Safari/534.55.3
</agent>
<copy>(c)2012 http://lamevaip.info</copy>
</lamevaip>


Podemos ver los elementos que forman el elemento root lamevaip que son: utc, ip, country, agent y copy.
Por lo que para parsear este xml, la librería necesita una clase que dictara que elementos debe contener y donde guardarlo. Al tener 4 elementos deberemos guardarlo de la siguiente forma:

@Root
public class LaMevaIp {

	@Element
	public String utc;
	@Element
	public String ip;
	@Element
	public String country;
	@Element
	public String agent;
	@Element
	public String copy;

}

Podemos ver que esta clase tiene anotaciones @Root, @Element. La primera anotacions significa que es la clase padre del xml. Mientras que la segunda significa como su nombre indica que es un elemento del xml y puede haber tantos como haya en el xml en nuestro ejemplo tenemos 5, más adelante puedes usar @Attributes @Value según la complejidad de tu xml.

Ahora llamamos al serializer del xml con la clase que hemos creado y nos lo devolvera en el objeto

	try {

    	   	   URL myURL = new URL( url_xml);
    	       /* Open a connection to that URL. */
    	       URLConnection ucon = myURL.openConnection(); 

    	       /* Define InputStreams to read
    	        * from the URLConnection. */
    	       InputStream is = ucon.getInputStream();
             Serializer serializer = new Persister();
     		  LaMevaIp ip_externa = serializer.read(LaMevaIp.class, is );

     		} catch (Exception e) {
     			e.printStackTrace();
     		}

Y con estos sencillos pasos ya tenemos un parser en xml. A continuación el código del ejemplo en github

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *