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