contacto[arroba]digitallearning.es
Parser SAX

Tratamiento de XML en Android: SAX

Post Series: Tratamiento de XML con SAX y DOM

Para realizar el tratamiento de información XML en Android tenemos básicamente dos modelos de programación: streaming y DOM.

El modelo de streaming lee y procesa la información de forma secuencial, mientras que el DOMcarga toda la información previamente en memoria, y una vez allí, puede manipularla a través del mapa de nodos que crea del documento.

El modelo secuencial es más rápido y requiere menos recursos de memoria y procesador. El modelo DOM nos da más flexibilidad y capacidad de manipulación de la información, al tenerla toda disponible de forma estructurada.

En esta publicación vamos a describir el analizador (parseador) SAX, basado en ese modelo secuencial, incluyendo un pequeño ejemplo, y en los siguientes tutoriales veremos el modelo DOM, desarrollando un proyecto ejemplo con él.

SAX (Simple API for XML)

SAX  es un parseador secuencial basado en eventos. Nos permite recorrer el archivo XML en pequeños fragmentos, a la vez que puede generar eventos al leer determinados elementos del documento como pueden ser las etiquetas de apertura o cierre o el contenido de texto.

SAX es un parseador de tipo ‘push‘, por lo que nos envía (push) los datos XML a nuestra aplicación cliente conforme los lee. Es decir, una vez empieza a leer el fichero XML, lo hace de forma completa, generando todos los eventos, sin que tengamos control sobre ello. Fun

Por el contrario, en los parseadores de tipo ‘pull‘, somos nosotros desde la aplicación cliente los que solicitamos explícitamente los datos XML (pull) cada vez que los necesitamos. Un ejemplo de este modelo es el método XmlPull, que mencionaremos brevemente al final de este tutorial ya que lo empleamos en una parte del proyecto que desarrollaremos en publicaciones posteriores.

Centrándonos pues en SAX, nos detendremos en las interfaces que expone el paquete org.xml.sax (documentación oficial de SAX) que nos proporcionan un fácil acceso a la lectura de un documento XML:

org.xml.sax.Attributes

Interfaz que se encargará de listar los atributos definidos dentro del XML.
Métodos públicos

Método Descripción
getIndex(String uri, String localName) Busca el índice por el nombre del espacio de nombres.
getLength() Devuelve el número de atributos en la lista.
getLocalName(int index) Busca el nombre de un atributo local por el índice.
getQName(int index) Busca el nombre de un atributo XML cualificado por el índice.
getValue(String qName) Busca el valor de un atributo XML cualificado.
getType(String qName) Busca el tipo de un atributo XML cualificado por el nombre.
getURI(int index) Busca la URI del espacio de nombres del atributo por el índice.

org.xml.sax.XMLReader

Interfaz que proporciona las herramientas necesarias para realizar la lectura de un documento XML haciendo uso de retrollamadas.
Métodos públicos

Método Descripción
getContentHandler() Devuelve el controlador actual de contenido.
getDTDHandler() Devuelve el controlador actual del DTD.
getEntityResolver() Devuelve la resolución de la entidad actual.
getFeature(String name) Look up the value of a feature flag.
parse(InputSource input) Parsea un documento XML.
setContentHandler(ContentHandler handler) Permite a una aplicación registrar el evento manejador de contenido.
setFeature(String name, boolean value) Establece el valor de la bandera del elemento.
setProperty(String name, Object value) Establece el valor de la propiedad.

org.xml.sax.ContentHandler

Interfaz que permite recibir notificaciones del contenido de un documento.
Métodos públicos

Método Descripción
endDocument() Recibe las notificaciones del final de un documento.
endElement(String uri, String localName, String qName) Recibe las notificaciones del final de un elemento.
startDocument() Recibe las notificaciones del comienzo de un documento.
startElement(String uri, String localName, String qName, Attributes atts) Recibe las notificaciones del comienzo de un elemento.
skippedEntity(String name) Recibe notificaciones de una entidad omitida.
setDocumentLocator(Locator locator) Recibe un objeto para localizar el origen de eventos del documento SAX.

Ejemplo con SAX

 

Parser SAX

Vamos a ver un pequeño ejemplo que nos permita comprender desde un punto de vista más funcional el uso de este método para la lectura de un documento XML. Para ello nos basaremos en este sencillo archivo XML:

Inicialmente, se implementa una clase llamada ParsearSAX, que hereda de la clase base DefaultHandler, y que sobrescribe una serie de métodos para controlar los eventos de SAX:

Función que inicializará las variables que posteriormente serán usadas en la clase. Este método posibilita el comienzo del procesado del documento:

Se van mostrando diferentes mensajes a raíz de cada evento que se va lanzando. Este método será llamado al comenzar procesar una etiqueta XML:

Se recorren los atributos de los elementos:

Al encontrar una cadena de texto se ejecutará el siguiente método:

Función encargada de comprobar la etiqueta final de cada elemento del documento:

Este método se lanzará al finalizar el procesado del documento:

Como se puede apreciar en el siguiente método, se crea una instancia SAXParserFactory, para posteriormente crear un nuevo parseador de tipo SAXParser. A continuación se crea un objeto ParsearSAX (que si recordamos heredaba de la clase DefaultHandler y sobrescribía una serie de métodos), asociándolo al XMLReader, indicándole finalmente el InputStream que recibe como argumento de entrada:

Finalmente, la salida de este ejemplo será la siguiente:


XMLPull

Como hemos indicado al principio, dentro del modelo de parseo en streaming hay otra forma de hacer el tratamiento de la información, que denominamos de tipo ‘pull’.

XmlPull es un parseado de ese tipo, muy similar al modelo StAX (Streaming API for XML), que sería como una variante de SAX. Todos hacen una lectura secuencial de la información, pero en los de tipo ‘pull’ somos nosotros los que vamos solicitando el siguiente elemento del fichero XML para realizar las acciones que necesitamos.

En una publicación posterior se describirá el método crearXML() dentro del ejercicio práctico que desarrollaremos y donde se hará uso de la interfaz XmlSerializer del paquete org.xmlpull.v1 para la creación de un documento XML (documentación oficial de la API)

 

This Post Has 2 Comments

Comments are closed.