1.01k likes | 1.15k Views
Tecnología XML. Dr. Diego Lz. de Ipiña Gz. de Artaza dipina@eside.deusto.es http://paginaspersonales.deusto.es/dipina. Contenidos. XML DTD Schema XML Parsing SAX API DOM API XSLT . ¿Qué es XML?. eXtensible Mark-up Language.
E N D
Tecnología XML Dr. Diego Lz. de Ipiña Gz. de Artaza dipina@eside.deusto.es http://paginaspersonales.deusto.es/dipina
Contenidos • XML • DTD • Schema • XML Parsing • SAX API • DOM API • XSLT
¿Qué es XML? • eXtensible Mark-up Language. • Es un metalenguaje que permite diseñar otros lenguajes (WML, MathML, XHTML,..). • Cualquiera puede desarrollar su propio lenguaje de etiquetas adecuado al tipo de aplicación que más le convenga. • En realidad hay muchas tecnologías basadas en XML (XPath, XLink, XPointer, XSL, ...). • XML 1.0 Specificationhttp://www.w3.org/TR/REC-xml
HTML y XML • SGML (Standard Generalized Markup Language) • HTML es una aplicación de SGML • XML es subconjunto más fácil de usar de SGML • XHTML es una aplicación de XML
XML describe estructura y semántica <?xml version=”1.0”> <!DOCTYPE comedor SYSTEM “comedor.dtd”> <comedor> <fabricante>Ipiña Altzariak</fabricante> <mesa tipo="redonda" madera="arce"> <precio>€400</precio> </mesa> <silla madera="arce"> <cantidad>2</cantidad> <calidad>excelente</calidad> <cojin incluido="sí"> <color>azul</color> </cojin> <precio>€200</precio> </silla> </comedor>
HTML describe formato <html> <head><title>Comedor</title></head> <body> <h1>Comedor</h1> <p>Fabricante: Ipiña Altzariak</p> <ul> <li><b>Mesa redonda de madera de arce</b></li> <li><b>Dos sillas de madera de arce</b>, de excelente calidad, con un cojín azul cada una.</li> <li><b>3 sillas de madera de roble</b>.</li> </ul> </body> </html>
Ventajas XML • Una de las mayores utilidades de XML es poder etiquetar los datos con su significado (self-describing data). • Permite la estructuración de la información. • Ello lleva el tratamiento automático de la información a límites insospechados. • XML es la base de la nueva generación de aplicaciones web intercambio de datos
Usos XML • Sitios web • Permite separar contenido y presentación • Comunicación <-> intercambio datos • Servicios web • Como configuración de programas • Deployment descriptos en servidores J2EE • Ant make system
Componentes documento XML • Los documentos XML constan de: • Instrucciones de procesamiento (processing instructions – PI) • Declaraciones de tipo de documento • Comentarios • Elementos • Referencias a entidades • Secciones CDATA
Instrucciones de procesamiento • Las PI son instruccciones para el procesador del documento XML. • Siempre hay al menos una PI, que pertenece al prólogo del documento: <?xml version="1.0"?> <saludo> Hola, mundo! </saludo>
Comentarios en XML • Los comentarios no se procesan. • Tienen la siguiente sintaxis: <!-- Esto es un comentario -->
Elementos y atributos en XML • Los elementos son los que aportan estructura semántica al documento. • Se delimitan por etiquetas de apertura, cierre y etiquetas sin elementos interiores (etiquetas vacías). • Las etiquetas de apertura y las vacías suelen venir acompañadas de atributos, que parametrizan el elemento. • El valor de los atributos siempre se encierra entre comillas, dobles o simples. <saludo tipo=“coloquial”>Hola</saludo>
Elementos vs. Atributos • Demasiados atributos hacen que los documentos XML se puedan leer difícilmente. • No se puede indicar estructura de documento mediante atributos <CUSTOMER LAST_NAME="Smith“ FIRST_NAME="Sam" DATE="October 15, 2001" PURCHASE="Tomatoes" PRICE=“€1.25" NUMBER="8" />
Elementos vs. Atributos (cont) <CUSTOMER> <NAME> <LAST_NAME>Smith</LAST_NAME> <FIRST_NAME>Sam</FIRST_NAME> </NAME> <DATE>October 15, 2001</DATE> <ORDERS> <ITEM> <PRODUCT>Tomatoes</PRODUCT> <NUMBER>8</NUMBER> <PRICE>$1.25</PRICE> </ITEM> </ORDERS> </CUSTOMER>
Referencias a entidades • Las referencias a entidades sirven para insertar un determinado contenido definido previamente. <!ENTITY Empresa “Universidad de Deusto”> <pie>Creado por &Empresa;</pie>
Códigos de escape • Existen 5 referencias a entidades predefinidas: • & el carácter & • < el carácter < • > el carácter > • ' el carácter ` • " el caracter “ • Se incluyen los caracteres del juego ISO 10646. ‘ ⼱
Secciones CDATA • Las secciones CDATA (character data) contienen texto que no debe ser procesado. • Se tratan como una secuencia de caracteres sin estructura. <![CDATA[<saludo>Hola, mundo!</saludo>]]>
Gramáticas en XML • La gramática que restringe los elementos válidos dentro de un nuevo derivado de XML puede expresarse en forma de: • DTD (Document Type Definitions) o • Esquemas XML
Document Type Definitions (DTDs) • Especifican la estructura y sintaxis de un documento XML • Labgroups.dtd <!ELEMENT lab_group (student_name)*> <!ELEMENT student_name (#PCDATA)> <!ATTLIST student_name dni ID #REQUIRED tutor IDREF #IMPLIED>
Document Type Definitions (cont) <?xml version="1.0"?> <!DOCTYPE mensaje SYSTEM “labgroups.dtd"> <lab_group> <student_name dni=“44670523"> Josu Artaza </student_name> <student_name dni=“44543211"> Nuria Buruaga </student_name> <student_name dni=“23554521" tutor=“33456211"> Inga Dorsman </student_name> </lab_group>
XML Schemas • Los DTD no son muy potentes para definir gramáticas. • Otra forma de hacerlo es con Esquemas XML basados en el propio XML y que soporta más tipos de datos.
Ejemplo Schema • DTD : <!ELEMENT text (#PCDATA | emph | name)*> <!ATTLIST text timestamp NMTOKEN #REQUIRED> • XML Schema: <xsd:element name="text"> <xsd:complexType mixed="true"> <xsd:sequence> <xsd:element ref="emph"/> <xsd:element ref="name"/> </xsd:sequence> <xsd:attribute name="timestamp" type="xsd:date" use="required"/> </xsd:complexType> </xsd:element>
Ejemplo Schema (cont) • XML Document: <?xml version="1.0"?> <text timestamp="08:45:00.000">The deadline of <name>ISO3 assigment</name> is <emph>November 21th 2003</emph>. </text>
XML bien formado y/o XML válido • Hay dos tipos de documentos XML: • Bien formados: son aquellos que cumplen las reglas sintácticas de XML • Válidos: son aquellos que, además de ser bien formados, siguen las reglas de una gramática (definida en un DTD o XML Schema)
Reglas para que un documento esté bien formado • Para que un documento esté bien formado: • Debe tener un prólogo • Debe tener una etiqueta raíz • Las etiquetas se hallan correctamente anidadas • Se usan caracteres válidos y bien aplicados • Los valores de los atributos vienen encerrados entre comillas • ...
Reglas para que un documento sea válido • Para que un documento sea válido debe declarar el DTD o XML Schema contra el cual debe validarse. • Se hace mediante DOCTYPE, pudiendo ser los DTD públicos o de sistema. <!DOCTYPE saludo SYSTEM “saludo.dtd”> <!DOCTYPE saludo PUBLIC “-//Saludos//DTD Lenguaje de saludos//ES” “http://www.deusto.es/dtds/saludo.dtd”> • También se puede insertar el DTD entero en ese punto, en lugar de referenciar al fichero.
XML Namespaces • El estándar XML también define los espacios de nombres (XML Namespaces). • Permiten que un mismo documento XML tenga etiquetas de diferentes lenguajes (definidas en diferentes gramáticas DTD). • Así es posible mezclar más información en los documentos, por ejemplo, añadir información semántica a un documento XHTML.
Ejemplo XML Namespaces <?xml version="1.0"?> <!DOCTYPE mensaje SYSTEM "mensaje.dtd"> <mensaje> <remite> <dir:direccion xmlns:dir=“http://www.deusto.es/direccion”> <dir:calle>Avda. Universidades</dir:calle> <dir:localidad cp=“40007”>Bilbao</dir:localidad> </dir:direccion> <nombre>Diego Ipiña</nombre> <email>dipina@eside.deusto.es</email> </remite> <!-- Resto del mensaje XML... --> </mensaje>
Lenguajes basados en XML • Chemical Markup Language (CML) • Mathematical Markup Language (MathML) • Channel Definition Format (CDF) • Synchronized Multimedia Integration Language (SMIL) • XHTML • Scalable Vector Graphics (SVG) • SOAP y WSDL • VoiceML • Wireless Markup Language (WML)
Herramientas de XML • Editores • http://www.xmlcooktop.com/ gratis • XML Spy, www.xmlspy.com • XML parsers • Lee un documento XML • Verifica que XML está bien formado • Verifican que XML es válido • expat, parser written in C by James Clark (www.jclark.com) • Lark, written in Java (www.textuality.com/Lark/) • Apache Jakarta Xerces (www.apache.org) • XML Validators • Verifican que XML es válido • XML.com's Validator based on Lark (xml.com)
¿Por qué usar XML? • Un documento XML puede ser fácilmente procesado y sus datos manipulados • Existen APIs para procesar esos documentos en Java, C, C++, Perl.. (y por supuesto Python) • XML define datos portables al igual que Java define código portable
XML Parsing (cont) • SAX • Define interfaz dirigido por eventos (event-driven) para el procesamiento de un documento XML • Definido por David Megginson y lista correo XML-DEV: http://www.megginson.com/SAX • DOM • Provee una representación de un documento XML en forma de un árbol • Carga todo el documento XML en memoria • http://www.w3.org/DOM
Simple API for XML: SAX • Define un interfaz común implementado por muchos XML Parsers • Es el estándar de-facto para procesamiento de XML basado en eventos • SAX no es un parseador de XML • SAX2 añade soporte para XML Namespaces • La especificación de SAX 2.0/Java está en:http://www.megginson.com/SAX/Java/index.html
Características de SAX • Analizador o parser SAX: • Detecta cuándo empieza y termina un elemento o el documento, o un conjunto de caracteres, etc. (genera eventos) • Gestiona los espacios de nombres • Comprueba que el documento está bien formado • Las aplicaciones necesitan implementar manejadores de los eventos notificados • SAX lee secuencialmente de principio a fin, sin cargar todo el documento en memoria • Ventaja:eficiencia en cuanto al tiempo y la memoria empleados en el análisis • Desventaja:no disponemos de la estructura en árbol de los documentos
XML Document SAX Objects <?xml version=“1.0”?> Parser endElement & endDocument endElement startElement startDocument startElement startElement & characters startElement & characters endElement startElement & characters startElement & characters <addressbook> </addressbook> Parser <person> </person> <name>Diego Ipiña</name> Parser <email>dipina@deusto.es</email> Parser Parser <person> </person> Parser <name>Asier Perallos</name> Parser Parser <email>perallos@deusto.es</email> Parser Parser ¿Cómo funciona SAX?
SAX2/Java Parsers y Drivers • Sun's JAXPhttp://java.sun.com/xml/ • The Apache XML Project's Xerces Java Parserhttp://xml.apache.org/xerces-j/index.html • SAXON XSLT processorhttp://users.iclway.co.uk/mhkay/saxon/ • Oracle XML Developer's Kit for Javahttp://technet.oracle.com/tech/xml/xdk_java.html • ParserAdapterhttp://www.megginson.com/SAX/Java/index.html
Java JAXP • Define clase SAXParserFactory para crear una instancia de un objeto SAXParser (independiente de implementación SAX parser) factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); • Objeto SAXParser define method parse() para arrancar procesamiento • Es necesario registrar SAXHandlers con cada SAXParser • Los 4 SAX Handlers principales son: • EntityResolver – maneja entidades externas • DTDHandler – maneja eventos de DTD • ContentHandler – maneja contenido de un documento • ErrorHandler – maneja errores
EntityResolver y DTDHandler • EntityResolver • InputSource resolveEntity(String publicId, String systemId) • DTDHandler • void notationDecl(String name, String publicId, String systemId) • void unparsedEntityDecl(String name, String publicId, String systemId, String notationName)
ErrorHandler void error(SAXParserException exception) • Recibe notificación de error recuperable. void fatalError(SAXParserException exception) • Recibe notificación de error fatal. void warning (SAXParserException exception) • Recibe notificación de advertencia.
ContentHandler void characters(char[] ch, int start, int length) • Recibe notificación de caracteres encontrados dentro de un elemento. void endDocument() • Recibe notificación de final de documento. void endElement(String namespaceURI, String localName, String qName) • Recibe notificación de final de elemento. void processingInstruction(String target, String data) • Recibe notificación cada vez que se encuentra una instrucción de procesamiento. void setDocumentLocator(Locator locator) • Recibe objeto para determinar el origen de los eventos en el documento. void startDocument() • Recibe notificación de comienzo de documento. void startElement(String namespaceURI, String localName, String qName, Attributes atts) • Recibe notificación de comienzo de elemento
DefaultHandler • Manejador de contenido que define una serie de métodos que son invocados cuando analizador detecta determinados eventos al leer documento • Clase de conveniencia que puede ser usada como clase base para aplicaciones SAX2 • Provee implementaciones por defecto de los métodos callback de los 4 manejadores de SAX2: • EntityResolver • DTDHanler • ErrorHandler • ContentHandler
Ejemplo SAX Parsing I <?xml version="1.0"?> <CarteleraCine> <Pelicula codigo='2' titulo='Los Otros' director='Alejandro Amenabar' actores='Nicole Kidman'> <Sesion>16:00</Sesion> <Sesion>19:00</Sesion> <Sesion>22:00</Sesion> </Pelicula> <Pelicula codigo='5' titulo='Malena' director='Giuseppe Tornatore' actores='Monica Bellucci, Giuseppe Sulfaro'> <Sesion>16:30</Sesion> <Sesion>19:00</Sesion> </Pelicula> </CarteleraCine>
Ejemplo SAX Parsing II import java.util.Vector; // Imports de JAXP API import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; // Imports de SAX API import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SesionCineSAXParser extends DefaultHandler { // Atributos en los que se cachea el estado de SesionesPelicula // Vector con todas las sesiones por pelicula de este cine private Vector sesionesPeliculas; // Vector con los strings de horarios de todas las sesiones de una pelicula private Vector sesionesStrPelicula; // Metadata asociada a una película private String codigo, titulo, director, actores; // Contenido textual de una sesión private String textoSesion; // Flag que indica si estamos parseando el contenido de texto de una sesión private boolean esTextoSesion = false; ...
Ejemplo SAX Parsing III public SesionCineSAXParser(String url) { // Obtener referencia al parser factory SAXParserFactory factory = SAXParserFactory.newInstance(); // factory.setNamespaceAware(true); // activar namespaces try { // Crear una nueva instancia de un SAX parser SAXParser saxParser = factory.newSAXParser(); // Parsear el documento apuntado por URL saxParser.parse(url, this); } catch (Throwable t) { t.printStackTrace(); } }
Ejemplo SAX Parsing IV public void startElement(String namespaceURI, String lName, String qName,Attributes attrs) throws SAXException { // lname --> contiene el nombre local (sin prefijo), o el string vacio // si procesamiento de namespaces no se lleva a cabo. // qname --> el nombre cualificado (con prefijo), o el string vacío si namespaces no activo if (qName.equals("CarteleraCine")) { this.sesionesPeliculas = new Vector(); } else if (qName.equals("Pelicula")) { // Por cada peli preparar vector con horarios de sesiones this.sesionesStrPelicula = new Vector(); this.codigo = attrs.getValue("codigo"); this.titulo = attrs.getValue("titulo"); this.director = attrs.getValue("director"); this.actores = attrs.getValue("actores"); } else if (qName.equals("Sesion")) { // Sólo recoger texto si dentro de sesión this.esTextoSesion = true; this.textoSesion = ""; } }
Ejemplo SAX Parsing V public void characters(char[] ch, int start, int length) { if (this.esTextoSesion == true) { // Sólo si estamos dentro de un elemento sesión // recogemos su contenido. // Si el contenido es largo este método callback puede ser // invocado varias veces por el parser SAX this.textoSesion += (new String(ch, start, length)).trim(); } }
Ejemplo SAX Parsing VI public void endElement(String namespaceURI, String sName, String qName) throws SAXException { if (qName.equals("Pelicula")) { // Salvamos los detalles de una pelicula en un objeto Pelicula pelicula = new Pelicula(this.codigo, this.titulo, this.director, this.actores); // Añadimos nuevo objeto SesionesPelicula a vector sesionesPeliculas this.sesionesPeliculas.add(new SesionesPelicula(pelicula, this.sesionesStrPelicula)); } else if (qName.equals("Sesion")) { // Por cada sesión salvar el texto conteniendo horario sesión this.esTextoSesion = false; this.sesionesStrPelicula.add(this.textoSesion); } }