Download Procesamiento de archivos XML (Parte 1) Referencias
Document related concepts
no text concepts found
Transcript
Procesamiento de archivos XML (Parte 1) Rubby Casallas Departamento de Ingeniería de Sistemas Universidad de los Andes 1 Arquitectura de Software Referencias • Esta presentación es un breve resumen de XML y no pretende 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-0517sax.html: generación de parsers sax Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 2 1 Arquitectura de Software Agenda 1. SAX 2. XSLT 3. DOM Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 3 Arquitectura de Software Procesamiento de documentos XML Parser dirigidos por eventos: SAX • Parser dirigidos por la estuctura: DOM • Lenguajes de transformación DSSSL, XSL • Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 4 2 Arquitectura de Software Simple API for XML: SAX SAX no es un Parser es una interface estándar basada en eventos 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 5 Arquitectura de Software Simple API for XML: SAX Es una interface programable de un parser de documentos XML 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 6 3 Arquitectura de Software Events <?xml version="1.0"?> <nombreCompleto> –start document <apellido>Casallas</apellido> <nombre>Rubby</nombre> </nombreCompleto> –start element: nombreCompleto –start element: apellido characters: Casallas –end element: apellido –start element: nombre characters: Rubby –end element: nombre –end element: nombreCompleto –end document Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 7 Arquitectura de Software Simple API for XML: SAX La aplicación debe implementar manejadores de los eventos • 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! Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 8 4 Arquitectura de Software JAXP JAXP es la interface programable para procesar XML desde java • 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 9 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 10 5 Arquitectura de Software 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. Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 11 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> Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 12 6 Arquitectura de Software 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 13 Arquitectura de Software Creación de un objeto parser Se tiene que tener un objeto fábrica que cree el objeto parser. • 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 (ver la documentación de la clase SAXParserFactory) Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 14 7 Arquitectura de Software Creación de un objeto parser (2) • Sobre el objeto factoria, se invoca la creación de un parser de tipo SAX: parser SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser saxParser = factory.newSAXParser(); ... } catch (Throwable t) { t.printStackTrace(); } Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 15 Arquitectura de Software • Asociación de un manejador de eventos al parser. Al parser creado se le asocia una referencia a un objeto que manejará los eventos: parser SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File(argv[0]), handler ); } catch (Throwable t) { t.printStackTrace(); } Esta es una referencia a una instancia de un manejador de eventos (una clase que implementa la interface Rubby Casallas G. ContentHandler) Departamento de Ingeniería de Sistemas Universidad de los Andes 16 8 Arquitectura de Software • Asociación de un manejador de eventos al parser (cont.) La referencia al manejador de eventos puede asociarse al parser 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 17 Arquitectura de Software El (los) manejador(es) de eventos public class DefaultHandler extends 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 18 9 Arquitectura de Software public class Echo extends DefaultHandler { public void startElement(...) throws SAXException { ... } public void endElement(...) throws SAXException { ... } ... // otros métodos que se necesite sobrecargar } Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 19 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 (); } } Rubby Casallas G. Departamento de Ingeniería de Sistemas Universidad de los Andes 20 10