Download SAX Parser

Document related concepts
no text concepts found
Transcript
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




2
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)
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




8
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.
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
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;
}
10
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
SAX :: Features y Properties
 Son utilizados para modificar el comportamiento del







15
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
SAX :: Filter





16
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
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
19
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