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