martes, 18 de noviembre de 2014

Tratamiento de XML con SAX Simplificado en Android



En el apartado anterior del tutorial vimos cómo realizar la lectura y tratamiento de un documento XML utilizando el modelo SAX clásico. Vimos cómo implementar un handler SAX, donde se definían las acciones a realizar tras recibirse cada uno de los posibles eventos generados por el parser XML.

Este modelo, a pesar de funcionar perfectamente y de forma bastante eficiente, tiene claras desventajas.

Por un lado se hace necesario definir una clase independiente para el handler. Adicionalmente, la naturaleza del modelo SAX implica la necesidad de poner bastante atención a la hora de definir dicho handler, ya que los eventos SAX definidos no están ligados de ninguna forma a etiquetas concretas del documento XML sino que se lanzarán para todas ellas, algo que obliga entre otras cosas a realizar la distinción entre etiquetas dentro de cada evento y a realizar otros chequeos adicionales.

Estos problemas se pueden observar perfectamente en el evento endElement() que definimos en el ejemplo del apartado anterior. En primer lugar teníamos que comprobar la condición de que el atributo noticiaActual no fuera null, para evitar confundir el elemento <title> descendiente de <channel> con el del mismo nombre pero descendiente de <item>. Posteriormente, teníamos que distinguir con un IF gigantesco entre todas las etiquetas posibles para realizar una acción u otra. Y todo esto para un documento XML bastante sencillo. No es difícil darse cuenta de que para un documento XML algo más elaborado la complejidad del handler podría dispararse rápidamente, dando lugar a posibles errores.

Para evitar estos problemas, Android propone una variante del modelo SAX que evita definir una clase separada para el handler y que permite asociar directamente las acciones a etiquetas concretas dentro de la estructura del documento XML, lo que alivia en gran medida los inconvenientes mencionados.

Veamos cómo queda nuestro parser XML utilizando esta variante simplificada de SAX para Android y después comentaremos los aspectos más importantes del mismo.


Debemos atender principalmente al método parse(). En el modelo SAX clásico nos limitamos a instanciar al handler definido en una clase independiente y llamar al correspondiente método parse() de SAX. Por el contrario, en este nuevo modelo SAX simplificado de Android, las acciones a realizar para cada evento las vamos a definir en esta misma clase y además asociadas a etiquetas concretas del XML. Y para ello lo primero que haremos será navegar por la estructura del XML hasta llegar a las etiquetas que nos interesa tratar y una vez allí, asignarle algunos de los listeners disponibles [de apertura (StartElementListener) o cierre (EndElementListener) de etiqueta] incluyendo las acciones oportunas. De esta forma, para el elemento <item> navegaremos hasta él obteniendo en primer lugar el elemento raíz del XML (<rss>) declarando un nuevo objeto RootElement y después accederemos a su elemento hijo <channel> y a su vez a su elemento hijo <item>, utilizando en cada paso el método getChild().
Una vez hemos llegado a la etiqueta deseada, asignaremos los listeners necesarios, en nuestro caso uno de apertura de etiqueta y otro de cierre, donde inicializaremos la noticia actual y la añadiremos a la lista final respectivamente, de forma análoga a lo que hacíamos para el modelo SAX clásico. Para el resto de etiquetas actuaremos de la misma forma, accediendo a ellas con getChild() y asignado los listeners necesarios.

Finalmente, iniciaremos el proceso de parsing simplemente llamando al método parse() definido en la clase android.Util.Xml, al que pasaremos como parámetros el stream de entrada, la codificación del documento XML y un handler SAX obtenido directamente del objeto RootElement definido anteriormente.

Importante indicar, tal como vimos en el apartado anterior, que si queremos ejecutar nuestro parser sin errores en cualquier versión de Android (sobre todo a partir de la 3.0) deberemos hacerlo mediante una tarea asíncrona. Tienes más información en el apartado anterior.

Como vemos, este modelo SAX alternativo simplifica la elaboración del handler necesario y puede ayudar a evitar posibles errores en el handler y disminuir la complejidad del mismo para casos en los que el documento XML no sea tan sencillo como el utilizado para estos ejemplos. Por supuesto, el modelo clásico es tan válido y eficiente como éste, por lo que la elección entre ambos es cuestión de gustos.

En el siguiente apartado pasaremos ya a describir el siguiente de los métodos de lectura de XML en Android, llamado Document Object Model (DOM).



Saludos compañeros, aprovechen la información.







No hay comentarios:

Publicar un comentario en la entrada