Tecnología XML

100
Tecnología XML Dr. Diego Lz. de Ipiña Gz. de Artaza [email protected] http://paginaspersonales.deusto .es/dipina

description

Tecnología XML. Dr. Diego Lz. de Ipiña Gz. de Artaza [email protected] http://paginaspersonales.deusto.es/dipina. Contenidos. XML DTD Schema XML Parsing SAX API DOM API XSLT . ¿Qué es XML?. eXtensible Mark-up Language. - PowerPoint PPT Presentation

Transcript of Tecnología XML

Page 1: Tecnología XML

Tecnología XML

Dr. Diego Lz. de Ipiña Gz. de [email protected]

http://paginaspersonales.deusto.es/dipina

Page 2: Tecnología XML

2

Contenidos XML

DTD Schema

XML Parsing SAX API DOM API

XSLT

Page 3: Tecnología XML

3

¿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

Page 4: Tecnología XML

4

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

Page 5: Tecnología XML

5

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>

Page 6: Tecnología XML

6

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>

Page 7: Tecnología XML

7

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

Page 8: Tecnología XML

8

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

Page 9: Tecnología XML

9

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

Page 10: Tecnología XML

10

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>

Page 11: Tecnología XML

11

Comentarios en XML Los comentarios no se procesan. Tienen la siguiente sintaxis:<!-- Esto es un comentario -->

Page 12: Tecnología XML

12

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>

Page 13: Tecnología XML

13

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" />

Page 14: Tecnología XML

14

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>

Page 15: Tecnología XML

15

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>

Page 16: Tecnología XML

16

Códigos de escape Existen 5 referencias a entidades predefinidas:

&amp; el carácter & &lt; el carácter < &gt; el carácter > &apos; el carácter ` &quot; el caracter “

Se incluyen los caracteres del juego ISO 10646.

&#145;&#x2F31;

Page 17: Tecnología XML

17

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>]]>

Page 18: Tecnología XML

18

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

Page 19: Tecnología XML

19

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>

Page 20: Tecnología XML

20

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>

Page 21: Tecnología XML

21

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.

Page 22: Tecnología XML

22

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>

Page 23: Tecnología XML

23

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>

Page 24: Tecnología XML

24

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)

Page 25: Tecnología XML

25

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 ...

Page 26: Tecnología XML

26

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.

Page 27: Tecnología XML

27

Proceso de validación documento XML

¿WellFormed?

DocumentoXML

DTD Error: DocumentoXML no válido

Error: DocumentoXML mal formado

Procesamiento dela información

¿Valid?

¿DTD?

(opcional) si

no

si

si

no

no

Page 28: Tecnología XML

28

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.

Page 29: Tecnología XML

29

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>[email protected]</email>

</remite><!-- Resto del mensaje XML... -->

</mensaje>

Page 30: Tecnología XML

30

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)

Page 31: Tecnología XML

31

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)

Page 32: Tecnología XML

32

¿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

Page 33: Tecnología XML

33

XML Parsing

DocumentoXML

XML DTDXML Schema

Parser XML AplicaciónXML

Page 34: Tecnología XML

34

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

Page 35: Tecnología XML

35

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

Page 36: Tecnología XML

36

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

Page 37: Tecnología XML

37

¿Cómo funciona SAX?XML DocumentXML Document

<?xml version=“1.0”?>

<addressbook>

</addressbook>

<person>

</person>

<name>Diego Ipiña</name>

<email>[email protected]</email>

<person>

</person>

<name>Asier Perallos</name>

<email>[email protected]</email>

SAX ObjectsSAX Objects

ParserParser startDocument

ParserParser startElement

ParserParser startElement & characters

ParserParser startElement & characters

ParserParser endElement

ParserParser startElement

ParserParser startElement & characters

ParserParser startElement & characters

ParserParser endElement

ParserParser endElement & endDocument

Page 38: Tecnología XML

38

SAX2/Java Parsers y Drivers Sun's JAXP

http://java.sun.com/xml/ The Apache XML Project's Xerces Java Parser

http://xml.apache.org/xerces-j/index.html SAXON XSLT processor

http://users.iclway.co.uk/mhkay/saxon/ Oracle XML Developer's Kit for Java

http://technet.oracle.com/tech/xml/xdk_java.html

ParserAdapterhttp://www.megginson.com/SAX/Java/index.html

Page 39: Tecnología XML

39

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

Page 40: Tecnología XML

40

Arquitectura Java JAXP

Page 41: Tecnología XML

41

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)

Page 42: Tecnología XML

42

ErrorHandlervoid 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.

Page 43: Tecnología XML

43

ContentHandlervoid 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

Page 44: Tecnología XML

44

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

Page 45: Tecnología XML

45

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>

Page 46: Tecnología XML

46

Ejemplo SAX Parsing IIimport java.util.Vector;// Imports de JAXP APIimport javax.xml.parsers.SAXParserFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;// Imports de SAX APIimport 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;

...

Page 47: Tecnología XML

47

Ejemplo SAX Parsing IIIpublic 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(); }}

Page 48: Tecnología XML

48

Ejemplo SAX Parsing IVpublic 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 = ""; }}

Page 49: Tecnología XML

49

Ejemplo SAX Parsing Vpublic 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(); }}

Page 50: Tecnología XML

50

Ejemplo SAX Parsing VIpublic 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); }}

Page 51: Tecnología XML

51

Ejemplo SAX Parsing VII// Método para recuperar vector con // objetos SesionesPelicula creados// en parsingpublic Vector getSesionesPeliculas() { return this.sesionesPeliculas;}

Page 52: Tecnología XML

52

W3C Document Object Model (DOM) Documentos XML son tratados como un

árbol de nodos Cada elemento es un “nodo” Los elementos hijos y el texto contenido

dentro de un elemento son subnodos W3C DOM Site: http://www.w3.org/DOM/ DOM Java Language Binding:

http://www.w3.org/TR/DOM-Level-2-Core/java-binding.html

Page 53: Tecnología XML

53

Características DOM Documento se carga totalmente en

memoria en una estructura de árbol Ventaja: fácil acceder a datos en

función de la jerarquía de elementos, así como modificar el contenido de los documentos e incluso crearlos desde cero.

Desventaja: coste en tiempo y memoria que conlleva construir el árbol

Page 54: Tecnología XML

54

W3C XML DOM Objects Element – un elemento XML Attribute – un attributo Text – texto contenido en un elemento o atributo CDATAsection – sección CDATA EntityReference – Referencia a una entidad Entity – Indicación de una entidad XML ProcessingInstruction – Una instrucción de

procesamiento Comment – Contenido de un comentario de XML Document – El objeto documento DocumentType – Referencia al elemento DOCTYPE DocumentFragment – Referencia a fragmento de

documento Notation – Contenedor de una anotación

Page 55: Tecnología XML

55

Objetos relacionados con Nodos Node – un nodo en el árbol de un

documento NodeList – una lista de objetos

nodos NamedNodeMap – permite

interacción y acceso por nombre a una colección de atributos

Page 56: Tecnología XML

56

Documento XML como un árbol de nodos

<?xml version="1.0" encoding="UTF-8"?> <DOCUMENT> <GREETING>Hello from XML</GREETING> <MESSAGE>Welcome to Programing XML in Java</MESSAGE>

</DOCUMENT>

Page 57: Tecnología XML

57

Documento XML como un árbol de nodos (cont)

Page 58: Tecnología XML

58

JAXP DOM API JAXP de J2SE provee independencia del

analizador Para conseguir una instancia de analizador

DOM a través de JAXP usamos DocumentBuilder y DocumentBuilderFactory:

import javax.xml.parsers.*;import org.w3c.dom.*;DocumentBuilderFactory fact =

DocumentBuilderFactory.newInstance();// Crear nueva instancia de DOMBuilder DocumentBuilder parser =

fact.newDocumentBuilder();

Page 59: Tecnología XML

59

Clase DocumentBuilder Método parse() analiza el fichero

entrada Método Document getDocument()

devuelve el documento generado durante parsing

parser.parse(fich);Document doc = parser.getDocument();

Page 60: Tecnología XML

60

Métodos del objecto Document Attr createAttribute(String name)

Crea un atributo con el nombre dado

Element createElement(String tagName)Crea un elemento con el nombre dado

Text createTextNode(String data)Crea un nodo de texto

Element getDocumentElement()Devuelve el elemento raíz el documento

Element getElementById(String elementId)Devuelve el elemento identificado por elementId

NodeList getElementsByTagName(String tagname)Devuelve una lista de elementos identificados por el nombre de etiqueta dado

Page 61: Tecnología XML

61

Métodos del interfaz Node Node

NamedNodeMap getAttributes()Devuelve lista de atributos en un nodo

Node getFirstChild()Devuelve el primer hijo de este nodo

Node getFirstChild()Devuelve el último hijo de este nodo

NodeList getChildNodes()Devuelve todos los hijos de este nodo

Node getParentNode()Devuelve nodo padre del nodo actual

short getNodeType()Devuelve tipo de nodo actual

String getNodeName()Devuelve nombre nodo

String getNodeValue()Devuelve contenido nodo

Page 62: Tecnología XML

62

Métodos del interfaz NodeList y NamedNodeMap NodeList

int getLength()Devuelve número de nodos en lista

Node item(int index)Devuelve el nodo identificado por index en una colección

NamedNodeMap int getLength()

Devuelve número de nodos en lista Node getNamedItem(String name)

Recupera un nodo dado su nombre Node item(int index)

Devuelve el nodo identificado por index en una colección

Page 63: Tecnología XML

63

Ejemplo DOM I<?xml version="1.0" encoding="iso-8859-1"?><Peliculas> <Pelicula codigo='1' titulo='Lo que el viento se

llevó' director='Victor Fleming' actores='Clark Gable, Vivien Leigh,

Leslie Howard'/> <Pelicula codigo='2' titulo='Los Otros' director='Alejandro Amenabar' actores='Nicole Kidman'/> <Pelicula codigo="5" titulo="Malena" director="Giuseppe Tornatore" actores="Monica Bellucci, Giuseppe

Sulfaro"/></Peliculas>

Page 64: Tecnología XML

64

Ejemplo DOM IIRoot

Películas

...Película

titulo=’Lo que elviento se llevó’codigo=1

actores=’Clark Gable, VivienLeigh, Leslie Howard’diirector=’Victor Fleming’

Película

titulo=’Malena’codigo=5

actores=’Monica Bellucci,Giuseppe Sulfaro’

diirector=’GiuseppeTornatore’

Page 65: Tecnología XML

65

Ejemplo DOM IIIimport org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import java.io.IOException;public class EjemploDOM { public static void main(String[] args) { ... DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); // Crear nueva instancia de DOMBuilder a través factoria DocumentBuilder parser = fact.newDocumentBuilder(); parser.parse(fich); Document doc = parser.getDocument(); EjemploDOM.tratarNodo(doc); ... }}

Page 66: Tecnología XML

66

Ejemplo DOM IVpublic static void tratarNodo(Node nodo) { switch (nodo.getNodeType()) { case Node.DOCUMENT_NODE: break; case Node.ELEMENT_NODE: break; case Node.ATTRIBUTE_NODE: break; case Node.TEXT_NODE: break; case Node.CDATA_SECTION_NODE: break; case Node.PROCESSING_INSTRUCTION_NODE: break; case Node.ENTITY_REFERENCE_NODE: break; case Node.DOCUMENT_TYPE_NODE: break; }}

Page 67: Tecnología XML

67

Ejemplo DOM Vcase Node.DOCUMENT_NODE: System.out.println("<xml version=\"1.0\">"); Document doc = (Document)nodo; tratarNodo(doc.getDocumentElement()); break;

Page 68: Tecnología XML

68

Ejemplo DOM VIcase Node.ELEMENT_NODE: String nombre = nodo.getNodeName(); System.out.print("<" + nombre); NamedNodeMap ats = nodo.getAttributes(); for (int i=0; i<ats.getLength(); i++) { tratarNodo(ats.item(i)); } System.out.println(">"); NodeList hijos = nodo.getChildNodes(); ... // tratar los hijos recursivamente break;case Node.ATTRIBUTE_NODE: System.out.print(" " + nodo.getNodeName() +

"=\"" + nodo.getNodeValue() +"\"");

Page 69: Tecnología XML

69

Ejemplo DOM VIIcase Node.TEXT_NODE: String texto = nodo.getNodeValue().trim(); if (!texto.equals("")) { System.out.println(ind + texto); } break;case Node.CDATA_SECTION_NODE: System.out.println(nodo.getNodeValue());break;

NodeList peliNodes = document.getElementsByTagName("Pelicula");

Page 70: Tecnología XML

70

Extensible Style Language Transformations (XSLT) I Con la diversidad de lenguajes de

presentación que hay (WML, HTML, cHTML) existen dos alternativas para desarrollar las aplicaciones: Desarrollar versiones de los procesos de

generación de presentación (JSP, ASP, CGI,..) para cada lenguaje.

Desarrollar solo una versión que genere XML y conversores de XML a los lenguajes de presentación.

Page 71: Tecnología XML

71

Extensible Style Language Transformations (XSLT) II Dos partes:

Transformation Language (XSLT) Formatting Language (XSL Formatting

Objects) XSLT transforma un documento XML en

otro documento XML XSLFO formatea y estiliza documentos

en varios modos XSLT W3C Recommendation -

http://www.w3.org/TR/xslt

Page 72: Tecnología XML

72

Operaciones entre árboles en XSL

Page 73: Tecnología XML

73

Ventajas y desventajas de XSLT Ventajas:

No asume un único formato de salida de documentos Permite manipular de muy diversas maneras un

documento XML: reordenar elementos, filtrar, añadir, borrar, etc.

Permite acceder a todo el documento XML XSLT es un lenguaje XML

Desventajas: Su utilización es más compleja que un lenguaje de

programación convencional Consume cierta memoria y capacidad de proceso

DOM detrás

Page 74: Tecnología XML

74

Usando hojas de estilo XSLT Para crear una transformación XSL

necesitamos: El documento XML a transformar

(students.xml) La hoja de estilo que especifica la

transformación (students.xsl)

Page 75: Tecnología XML

75

Documento XML (students.xml)<?xml version="1.0"?> <course> <name id="csci_2962">Programming XML in Java</name> <teacher id=“di">Diego Ipiña</teacher> <student id=“ua"> <name>Usue Artaza</name> <hw1>30</hw1> <hw2>70</hw2> <project>80</project> <final>85</final> </student> <student id=“iu"> <name>Iñigo Urrutia</name> <hw1>80</hw1> <hw2>90</hw2> <project>100</project> <final>40</final> </student> </course>

Page 76: Tecnología XML

76

Hoja de estilo XSLT (students.xsl)<?xml version="1.0"?> <xsl:stylesheet version="1.0“

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="course"> <HTML> <HEAD><TITLE>Name of students</TITLE></HEAD> <BODY> <xsl:apply-templates select="student"/> </BODY> </HTML> </xsl:template> <xsl:template match="student"> <P><xsl:value-of select="name"/></P> </xsl:template> </xsl:stylesheet>

Page 77: Tecnología XML

77

Resultado de transformación (students.html)

<HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD>

<BODY> <P>Usue Artaza</P> <P>Iñigo Urrutia</P> </BODY> </HTML>

Page 78: Tecnología XML

78

Formas de uso de XSLT Visualizar directamente en un navegador el

documento XML que tiene asociada una hoja XSLT.

Ejecutar el procesador XSLT independientemente del navegador. Se le pasan las entradas necesarias (fichero origen y hoja XSLT a utilizar) y genera la salida en un fichero, con el que podemos hacer lo que queramos.

Realizar las transformaciones dentro de un programa en el servidor y enviar a los clientes sólo el resultado de la transformación.

Page 79: Tecnología XML

79

Aplicaciones usando XSLT

InternetJSP

Clases Java

Base de Datos

Cliente ServidorXML

Arquitectura en 5 capas dónde el servidor contiene conversores XSLT para generar presentación en distintos formatos.

XSLT

Page 80: Tecnología XML

80

Ejemplos de Procesadores XSLT existentes Oracle XML parser for Java

http://technet.oracle.com/tech/xml/parser_java2/ Saxon

http://users.iclway.co.uk/mhkay/saxon/index.html XT

http://www.jclark.com/xml/xt.html Sablotron

http://www.gingerall.com/charlie-bin/get/webGA/act/sablotron.act

Microsoft XML Parserhttp://msdn.microsoft.com/downloads/webtechnology/xml/msxml.asp

Xalan Javahttp://xml.apache.org/xalan-j/index.html

Java JAXP

Page 81: Tecnología XML

81

XSLT son documentos XML bien formados xsl:stylesheet – elemento raiz xsl:template – cómo transformar un nodo

seleccionado Se asocia con un fragmento del documento a través

de una expresión en XPath Transforma XML entrante en otro fragmento de XML match – Atributo para seleccionar nodo

"/" – nodo raiz del documento de entrada Elemento xsl:apply-templates. Aplica los

templates definidos para los hijos de un nodo seleccionado

Page 82: Tecnología XML

82

Ejemplo XSLT<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/"> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>

Page 83: Tecnología XML

83

Elementos XSLT xsl:value-of permite recuperar el valor de un nodo

Los nodos son seleccionados usando la sintáxis de la especificación XPath XML

Sólo selecciona el valor del primer estudiante que encuentre<xsl:template match=“course">

<xsl:value-of select=“student"/> </xsl:template>

Si queremos seleccionar varios podemos hacer:<xsl:template match=“course">

<xsl:apply-templates select=“student"/> </xsl:template> <xsl:template match=“student">

<xsl:value-of select="."/> </xsl:template>

O usar xsl:for-each<xsl:template match=“course">

<xsl:for-each select=“student"> <xsl:value-of select="."/> </xsl:for-each>

</xsl:template>

Page 84: Tecnología XML

84

Elementos XSLT (cont) Para realizar distintos procesamientos

en función de los datos se usa xsl:choose: Se compone de elementos xsl:when Un elemento opcional xsl:otherwise

Para procesar o no un elemento en función de una condición se usa xsl:if: Condición en atributo test

Page 85: Tecnología XML

85

Ejemplo<?xml version="1.0"?> <xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD> <BODY> <xsl:apply-templates/> </BODY> </HTML> </xsl:template> <xsl:template match="course"> <xsl:apply-templates select="student"/> </xsl:template> <xsl:template match="student"> <xsl:for-each select="name"><P><xsl:value-of

select="."/></P></xsl:for-each> </xsl:template> </xsl:stylesheet>

Page 86: Tecnología XML

86

Patrones XPath para el atributo match o select Seleccionar el nodo raiz: <xsl:template match="/"> ... </xsl:template> Seleccionar un elemento: <xsl:template match="student"> ...</xsl:template> Seleccionar hijos de un elemento: <xsl:template match="course/student"> ...

</xsl:template><xsl:template match="course/*/name"> ...

</xsl:template> Seleccionar descendientes de un elemento:<xsl:template match="course//name"> ...

</xsl:template>

Page 87: Tecnología XML

87

Patrones XPath para el atributo match o select Seleccionar atributo título:

<xsl:value-of select="./@id"/> Seleccionar comentarios:

<xsl:template match="comment()"> ... </xsl:template>

Seleccionar elementos de texto:<xsl:template match="text()"> ... </xsl:template>

Recuperar posición que ocupa un sub-elemento dentro de elemento padre<xsl:value-of select="position()"/>

Page 88: Tecnología XML

88

Evaluando condiciones con [] Evaluando si una condición es cierta:

Si el elemento estudiante tiene un hijo name<xsl:template match="student[name]"> Cualquier elemento que tiene un elemento

namE<xsl:template match="*[name]"> Elemento student tiene un sub-elemento hw1

o hw2 element<xsl:template match="student[hw1 | hw2]">

Page 89: Tecnología XML

89

Ejemplo XSLTProblema: Imprimir nombre de alumnos con nota media mayor de 65%

<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="course"> <xsl:apply-templates select="student"/> </xsl:template> <xsl:template match="student"> <xsl:variable name="ave"> <xsl:value-of select="(hw1 + hw2 + project + final) div 4"/> </xsl:variable> <xsl:if test="$ave > 65">

Student name="<xsl:value-of select="name"/>" average="<xsl:value-of select="$ave"/>"

</xsl:if> </xsl:template> </xsl:stylesheet>

Page 90: Tecnología XML

90

Resultado transformación Salida (grades70.txt):

Student name=“Usue Artaza" average="66,25"

Student name=“Iñigo Urrutia" average="77,5"

Page 91: Tecnología XML

91

Java JAXP Provee clase Transformer para la

aplicación de XSL a un documento XML

Como siempre Java JAXP asegura que el código fuente sea el mismo independientemente del parser XSLT subyacente

Page 92: Tecnología XML

92

Usando Java JAXPimport javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import

javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document; ...

Page 93: Tecnología XML

93

Usando Java JAXP (cont)public String obtenerCarteleraHMTL() { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { // Usar JAXP DOM para generar Document con fichero xml DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(

"http://localhost:8080/cartelera/Cines.jsp?Funcion=TodaCartelera"); // Generar un objeto transformer para realizar transform XSL TransformerFactory tFactory = TransformerFactory.newInstance(); StreamSource stylesource = new StreamSource( "http://localhost:8080/cartelera/Cartelera.xsl"); Transformer transformer = tFactory.newTransformer(stylesource); DOMSource source = new DOMSource(document); ByteArrayOutputStream outputByteArray = new ByteArrayOutputStream(); StreamResult result = new StreamResult(outputByteArray); transformer.transform(source, result); return outputByteArray.toString(); } catch (Exception e) { e.printStackTrace(); }}

Page 94: Tecnología XML

94

Ejemplo XML + XSL XHTML I<?xml version="1.0" encoding="iso-8859-1"?><Cartelera> <Cine codigo='1' nombre='Coliseo Java' direccion='Avda. Abaro'

poblacion='Portugalete'> <Pelicula codigo='1' titulo='Lo que el viento se llevó' director= 'Victor Fleming ' actores= 'Clark Gable, Vivien Leigh, Leslie

Howard '> <Sesion>16:00</Sesion>

<Sesion>19:30</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> </Cine> …</Cartelera>

Page 95: Tecnología XML

95

Ejemplo XML + XSL XHTML II<?xml version="1.0" encoding="iso-8859-1"?><xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform

version="1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head> <style type="text/css"> table {font-family: arial, 'sans serif';

margin-left: 15pt;} th,td {font-size: 80%;} th {background-color:#FAEBD7} </style> </head> <body> <table border="1"> <xsl:apply-templates/> </table> </body> </html> </xsl:template>

Page 96: Tecnología XML

96

Ejemplo XML + XSL XHTML III <xsl:template match="Cartelera"> <xsl:for-each select="Cine"> <tr> <th><xsl:text>Cine</xsl:text></th> <th><xsl:text>Dirección</xsl:text></th> <th><xsl:text>Población</xsl:text></th> <th></th> </tr> <tr> <td><xsl:value-of select="./@nombre"/></td> <td><xsl:value-of select="./@direccion"/></td> <td><xsl:value-of select="./@poblacion"/></td> <td><xsl:text></xsl:text></td>

</tr> <xsl:for-each select="Pelicula“> <tr> <th></th> <th><xsl:text>Película</xsl:text></th> <th><xsl:text>Director</xsl:text></th> <th><xsl:text>Actores</xsl:text></th> </tr> <tr> <td><xsl:text></xsl:text></td> <td><xsl:value-of select="./@titulo"/></td> <td><xsl:value-of select="./@director"/></td> <td><xsl:value-of select="./@actores"/></td> </tr>

Page 97: Tecnología XML

97

Ejemplo XML + XSL XHTML IV <tr> <th></th> <th></th> <th><xsl:text>Sesión</xsl:text></th> <th><xsl:text>Hora</xsl:text></th> </tr> <xsl:for-each select="Sesion"> <tr> <td><xsl:text></xsl:text></td> <td><xsl:text></xsl:text></td> <td><xsl:value-of

select="position()"/></td> <td><xsl:value-of select="."/></td> </tr> </xsl:for-each> </xsl:for-each> </xsl:for-each> </xsl:template></xsl:stylesheet>

Page 98: Tecnología XML

98

Ejemplo XML + XSL XHTML V<html> <body> <table border="1"> <tr> <th>Cine</th> <th>Direcci&oacute;n</th> <th>Poblaci&oacute;n</th> <th></th> </tr> <tr> <td>Coliseo Java</td> <td>Avda. Abaro</td> <td>Portugalete</td> <td></td> </tr> <tr> <th></th> <th>Pel&iacute;cula</th> <th>Director</th> <th>Actores</th> </tr>

Page 99: Tecnología XML

99

Ejemplo XML + XSL XHTML VI <tr> <td></td> <td>Lo que el viento se llev&oacute;</td> <td>Santiago Segura</td> <td>Bo Derek, Al Pacino, Robert Reford</td> </tr> <tr> <th></th> <th></th> <th>Sesi&oacute;n</th> <th>Hora</th> </tr> <tr> <td></td> <td></td> <td>1</td> <td>16:00</td> </tr> <tr> ... </table> <body></html>

Page 100: Tecnología XML

100

Resultado procesamiento XSLT