1
1
Rubby Casallas
Departamento de Ingeniería de Sistemas Universidad de los Andes
Rubby Casallas G.
Departamento de Ingeniería de Sistemas Universidad de los Andes
2
Arquitectura de Software
Referencias
• Esta presentación es un breve resumen de XML y nopretende ser exhaustiva. Para más información por favor consultar las siguientes referencias:
– http://www.xml.com/axml/testaxml.htm: especificación 1.0 de XML comentada.
– http://java.sun.com/webservices/docs/ea2/tutorial/doc/J AXPIntro.html: tutorial de JAXP
– http://www.javaworld.com/javaworld/jw-05-2002/jw-0517-sax.html: generación de parsers sax
Rubby Casallas G.
Departamento de Ingeniería de Sistemas
Universidad de los Andes 3
Agenda
1. SAX 2. XSLT 3. DOM Arquitectura de SoftwareProcesamiento de documentos XML
• Parser dirigidos por eventos: SAX• Parser dirigidos por la estuctura: DOM • Lenguajes de transformación DSSSL, XSL
3
Rubby Casallas G.Departamento de Ingeniería de Sistemas
Universidad de los Andes 5
Simple API for XML: SAX
• SAX no es un Parser es una interface estándar basada eneventos para hacer parser de documentos XML
• Es una interface común implementada por varios parsers • Un parser SAX requiere poca memoria porque no construye
una representación interna del archivo XML
Rubby Casallas G.
Departamento de Ingeniería de Sistemas Universidad de los Andes
6
Arquitectura de Software
Simple API for XML: SAX
• Es una interface programable de un parser de documentosXML basado en eventos.
• A medida que el parser encuentra un elemento, en el archivo XML, lo va reportando.
• Quiere decir que el parser no guarda en memoria ninguna representación del documento (contrario a DOM)
• Los eventos que se reportan a la aplicación son: – start Element
– start Document – end Element
Rubby Casallas G.
Departamento de Ingeniería de Sistemas
Universidad de los Andes 7
<?xml version="1.0"?> <nombreCompleto>
<apellido>Casallas</apellido> <nombre>Rubby</nombre>
</nombreCompleto>
Events
–start document
–start element: nombreCompleto –start element: apellidocharacters: Casallas
–end element: apellido
–start element: nombrecharacters: Rubby
–end element: nombre
–end element: nombreCompleto –end document
Arquitectura de Software
Simple API for XML: SAX
• La aplicación debe implementar manejadores de loseventos
• La aplicación debe crear un(s) objeto de una clase que implemente la interface para manejar eventos.
• Este objeto se registra con el parser y, de acuerdo con los eventos que el parser genere, se invocan los métodos de procesamiento que se definieron en la aplicación.
• Por ejemplo: Evento
– start document se invoca el método startDocument(...) sobre el objeto que está registrado!
5
Rubby Casallas G.Departamento de Ingeniería de Sistemas
Universidad de los Andes 9
JAXP
• JAXP es la interface programable para procesar XML desdejava
• Permite programar usando SAX, DOM y XSLT • El paquete principal es: javax.xml.parsers package. • Provee dos clases para crear parsers (independientes del
proveedor):
– SAXParserFactory – DocumentBuilderFactory
• Esto permite cambiar la implementación del parser de XML sin cambiar el código de la aplicación.
Rubby Casallas G.
Departamento de Ingeniería de Sistemas Universidad de los Andes
10
Arquitectura de Software
Interfaces de SAX
• ContentHandler: declara los métodos:– startDocument, endDocument, startElement,
endElement (estos son invocados cuando un tag xml es encontrado)
– characters es invocado cuando el parser encuentra un texto en un elemento xml
– processingInstruction cuando encuentra una instrucción de procesamiento
Rubby Casallas G.
Departamento de Ingeniería de Sistemas
Universidad de los Andes 11
Interfaces de SAX
• ErrorHandler– los métodos: error, fatalError y warning son invocados en respuesta a varios tipos de error en el parser
– Por defecto se dispara una excepción para errores fatales y se ignoran otros errores incluyecdo los de validación.
– Para manejar los errores, de acuerdo con alguna
política de la aplicaión, se debe suministrar al parser un manejador de errores propio.
Arquitectura de Software
Interfaces de SAX
• DTDHandler– Se usa cuando se procesa un DTD para reconocer y manipular declaraciones de una entidad unparsed. Por ejemplo:
<!ENTITY mom-picture SYSTEM "http://www.home.com/mom.jpg" NDATA JPEG>
7
Rubby Casallas G.Departamento de Ingeniería de Sistemas
Universidad de los Andes 13
Interfaces de SAX
• EntityResolver– Tiene un método para localizar entidades dado un URI
Rubby Casallas G.
Departamento de Ingeniería de Sistemas Universidad de los Andes
14
Arquitectura de Software
Creación de un objeto parser
• Se tiene que tener un objeto fábrica que cree el objetoparser.
• Para tener el objeto fábrica apropiado (dependiendo del parser que se desee usar: xalan, xt, o el que viene por defecto con la implementación java) se invoca:
// Use the default (non-validating) parser SAXParserFactory factory =
SAXParserFactory.newInstance(); • Para resolver cuál tipo de parser crear, se usa, en
primer lugar, la configuración que esté definida en: javax.xml.parsers.SAXParserFactory system property
Rubby Casallas G.
Departamento de Ingeniería de Sistemas
Universidad de los Andes 15
Creación de un objeto parser (2)
• Sobre el objeto factoria, se invoca la creación de un parser detipo SAX:
parser SAXParserFactory factory =
SAXParserFactory.newInstance(); try {
SAXParser saxParser = factory.newSAXParser(); ...
} catch (Throwable t) { t.printStackTrace(); }
Arquitectura de Software
Asociación de un manejador de eventos al
parser.
• Al parser creado se le asocia una referencia a un objeto quemanejará los eventos:
parser SAXParserFactory factory =
SAXParserFactory.newInstance(); try {
SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File(argv[0]), handler);
} catch (Throwable t) { t.printStackTrace(); }
9
Rubby Casallas G.Departamento de Ingeniería de Sistemas
Universidad de los Andes 17
Asociación de un manejador de eventos al
parser (cont.)
• La referencia al manejador de eventos puede asociarse alparser y cambiarse en cualquier momento. parser SAXParserFactory factory =
SAXParserFactory.newInstance(); try {
SAXParser saxParser = factory.newSAXParser();
saxParser.getXMLReader().setContentHandler (handler);
saxParser.parse( new File(argv[0])); } catch (Throwable t) {
t.printStackTrace();
} Se le está indicando al parser cuál es la referencia que va a manejar
los eventos
Rubby Casallas G.
Departamento de Ingeniería de Sistemas Universidad de los Andes
18
Arquitectura de Software
El (los) manejador(es) de eventos
public class DefaultHandlerextends java.lang.Object
implements EntityResolver, DTDHandler, ContentHandler,
ErrorHandler
• Contiene implementaciones por defecto para todos los métodos de las interfaces SAX.
• Se debe extender esta clase para sobre cargar los métodos que se necesiten:
Rubby Casallas G.
Departamento de Ingeniería de Sistemas
Universidad de los Andes 19
public class Echo extends DefaultHandler {
public void startElement(...) throws SAXException {
... }
public void endElement(...) throws SAXException {
... }
... // otros métodos que se necesite sobrecargar }
Arquitectura de Software
public void startElement(java.lang.String uri, java.lang.String localName, java.lang.String qName, Attributes attributes) throws SAXException { if (qName.equals (“courseInfo")) { String id = attributes.getValue(“id"); String header = “Curso: "+id;
System.out.println (header); System.out.println (); }