SAX Parser Ing. Augusto Dobeslao Herández López (Bases de Datos en XML)
Simple API for XML (SAX) Proporciona mecanismos para leer desde un documento XML. Es un API orientada a eventos, actualmente en su versión 2.0 No conlleva a la generación de estructuras internas, esto es, no crea un árbol del documento Deben registrar manejadores de eventos que utilizarán los parsers Es una alternativa popular al Document Object Model (DOM) 2
SAX :: Orígenes SAX fue originalmente definido como un API de Java, pero ya ha sido portado a otros lenguajes orientados a objetos. La idea de SAX es sencilla, el analizador lee el documento XML desde el inicio y avisa a la aplicación qué es lo que encontró Existen muchos parsers XML que implementan el API SAX, incluyendo Xerces, Crimson, Oracle XML Parser y Ælfred. 3
SAX :: Ventajas Se puede comenzar a procesar tan pronto como se recibe No se tiene que esperar a leer todo el documento antes de actuar sobre los datos El documento entero no tiene que residir en memoria Es conveniente para documentos largos 4
SAX :: Funcionamiento La mayoría de los programa SAX son más específicos y sólo trabajan con ciertos XML Buscan por elementos o atributos particulares en lugares específicos y responden a ellos de manera particular La parte complicada de la mayoría de los programas SAX es la estructura de datos para almacenar la información obtenida por el parser 5
SAX :: Ingredientes Un parser XML Las clases de SAX Un documento XML 6
SAX :: Creación SAX es una colección de interfaces en el paquete org.xml.sax. Uno de las cuales XMLReader, representa el parser XML, declara los métodos para parsear el documento y configurar el proceso de parseo, por ejemplo activando la validación. Primero es necesario crear una instancia con la clase XMLReaderFactory, en el paquete org.xml.sax.helpers, con el método estático createxmlreader() que produce el parser especifico. Una vez creado el parser, se proporciona el ID del sistema, una URL relativa o absoluta al método parse() como una cadena 7
SAX :: Exception El método parse() arroja una SAXParseException si el documento esta mal formado. IOException si se rompe la comunicación mientras el documento es leído. SAXException si algo más sale mal. Cualquier otra cosa, devuelve void. Para recibir información del parser a medida que lee el documento, debe configurarse con un ContentHandler. 8
SAX :: ContentHandler Es un conjunto de llamadas que SAX define para permitir a los programadores insertar código en los eventos importantes durante el parseo de los documentos. Es una interface en el paquete org.xml.sax, la cual debe ser implementada de acuerdo a las necesidades. Luego se configura el XMLReader con una instancia de nuestra implementación, a medida que se lee el documento, se invocan los metodos para decir que es lo que hay en el XML. 9
SAX :: ContentHandler 10 public interface ContentHandler { public void setdocumentlocator(locator locator); public void startdocument() throws SAXException; public void enddocument() throws SAXException; public void startprefixmapping(string prefix, String uri) throws SAXException; public void endprefixmapping(string prefix) throws SAXException; public void startelement(string namespaceuri, String localname, String qname, Attributes atts) throws SAXException; public void endelement(string namespaceuri, String localname, String qname) throws SAXException; public void characters(char[] ch, int start, int length) throws SAXException; public void ignorablewhitespace(char[] ch, int start, int length) throws SAXException; public void processinginstruction(string target, String data) throws SAXException; public void skippedentity(string name) throws SAXException; }
SAX :: Element Callbacks El método startelement( ), proporciona información sobre el elemento y cualquier atributo que tenga. La firma del método indica el nombre del elemento (en varios formatos) y una instancia de sus atributos. El final de un elemento se identifica por la llamada endelement( ), tiene una llamada similar al anterior, pero no contiene la estructura de los atributos. La llamada characters( ), proporciona un envolvente con un arreglo de caracteres, el índice y la longitud a leer. Se debe tener cuidado porque el parser puede elegir enviar todos los datos de forma contigua o dividirlo en múltiples llamadas. 11
SAX :: DefaultHandler Si implementamos la clase a partir de ContentHandler debemos sobrecargar todos sus métodos, pero si sólo se quiere proporcionar uno o dos métodos, se puede hacer una subclase a partir de DefaultHandler, que realiza una implementación vacía de todos los métodos, y enfocarse solo en los que se está interesado. Evita implementar métodos vacios. 12
SAX :: Ejemplo ejemplo.xml SAXInitialParser.java 13
SAX :: Ejemplo SAXParserExample.java 14
15 SAX :: Features y Properties Son utilizados para modificar el comportamiento del parser. Cada una tienen un nombre absoluto URI Los Features pueden ser verdaderos o falsos Los Properties tienen valores de un tipo de objeto Diferentes parsers soportan diferentes grupos de estos Feature : http://xml.org/sax/features/validation Propertie: http://xml.org/sax/properties/documentxml-version Pueden lanzarse las excepciones SAXNotRecognizedException y SAXNotSupportedException, por diversas causas
16 SAX :: Filter Un filtro se coloca entre el parser y la aplicación cliente e intercepta los mensajes que estos se envían Puede pasarlos sin cambios, modificarlos, reemplazarlos o bloquearlos Para la aplicación cliente parece como un parser (XMLReader), para el parser como una aplicación cliente (ContentHandler) Se implementa haciendo una subclase de org.xml,sax.helpers.xmlfilterimpl Al implementar la subclase se sobrecargan los métodos correspondientes a los mensajes que se desean filtrar
SAX :: Filter Generalmente involucran los siguientes pasos: 1. Crear un objeto filter 2. Crear un XMLReader que parsea el documento 3. Adjuntar el filtro al parser, setparent() 4. Instalar un ContentHandler en el filtro 5. Parsear el documento con el parse() del filtro 17
SAX :: Más Ejemplos Validación documentos bien formados src\xmlparser\saxvaliddocument.java Implementación de Filtro para correo electrónico src\xmlparser\saxfilteremail.java 18
19 SAX :: vs DOM Es mejor DOM cuando: Se requiere modificar la estructura del XML Se comparte el documento en memoria con otras aplicaciones El tamaño del documento no es muy grande Es mejor SAX cuando: La tarea a realizar requiere mucha memoria y alto rendimiento No es necesario recorrer la estructura completa del documento Se requiere ir procesando los elementos del archivo a medida que van llegando
SAX :: Referencias XML IN A NUTSHELL (A desktop Quick Refrence) Elliotte Rusty Harold & W. Scott Means, O'Reilly 2004 tercera edición Java & XML (Solutions to Real-World Problems) Brett McLaughblin, O Reilly 2001 segunda edición The J2EE 1.4 Tutorial (Chapter 5. Simple API for XML), http://java.sun.com/j2ee/1.4/docs/tutorial/doc/ 20