Title: Tecnolog
1Tecnología XML
- Dr. Diego Lz. de Ipiña Gz. de Artaza
2Contenidos
- XML
- DTD
- Schema
- XML Parsing
- SAX API
- DOM API
- XSLT
3Qué 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
4HTML 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
5XML describe estructura y semántica
- lt?xml version1.0gt
- lt!DOCTYPE comedor SYSTEM comedor.dtdgt
- ltcomedorgt
- ltfabricantegtIpiña Altzariaklt/fabricantegt
- ltmesa tipo"redonda" madera"arce"gt
- ltpreciogt400lt/preciogt
- lt/mesagt
- ltsilla madera"arce"gt
- ltcantidadgt2lt/cantidadgt
- ltcalidadgtexcelentelt/calidadgt
- ltcojin incluido"sí"gt
- ltcolorgtazullt/colorgt
- lt/cojingt
- ltpreciogt200lt/preciogt
- lt/sillagt
- lt/comedorgt
6HTML describe formato
- lthtmlgt
- ltheadgtlttitlegtComedorlt/titlegtlt/headgt
- ltbodygt
- lth1gtComedorlt/h1gt
- ltpgtFabricante Ipiña Altzariaklt/pgt
- ltulgt
- ltligtltbgtMesa redonda de madera de
arcelt/bgtlt/ligt - ltligtltbgtDos sillas de madera de
arcelt/bgt, de excelente calidad, con un cojín azul
cada una.lt/ligt - ltligtltbgt3 sillas de madera de roblelt/bgt.lt/ligt
- lt/ulgt
- lt/bodygt
- lt/htmlgt
7Ventajas 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
8Usos XML
- Sitios web
- Permite separar contenido y presentación
- Comunicación lt-gt intercambio datos
- Servicios web
- Como configuración de programas
- Deployment descriptos en servidores J2EE
- Ant make system
9Componentes 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
10Instrucciones 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 - lt?xml version"1.0"?gt
- ltsaludogt
- Hola, mundo!
- lt/saludogt
11Comentarios en XML
- Los comentarios no se procesan.
- Tienen la siguiente sintaxis
- lt!-- Esto es un comentario --gt
12Elementos 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. - ltsaludo tipocoloquialgtHolalt/saludogt
13Elementos vs. Atributos
- Demasiados atributos hacen que los documentos XML
se puedan leer difícilmente. - No se puede indicar estructura de documento
mediante atributos - ltCUSTOMER LAST_NAME"Smith
- FIRST_NAME"Sam" DATE"October 15, 2001"
PURCHASE"Tomatoes" PRICE1.25" NUMBER"8" /gt
14Elementos vs. Atributos (cont)
- ltCUSTOMERgt
- ltNAMEgt
- ltLAST_NAMEgtSmithlt/LAST_NAMEgt
- ltFIRST_NAMEgtSamlt/FIRST_NAMEgt
- lt/NAMEgt
- ltDATEgtOctober 15, 2001lt/DATEgt
- ltORDERSgt
- ltITEMgt
- ltPRODUCTgtTomatoeslt/PRODUCTgt
- ltNUMBERgt8lt/NUMBERgt
- ltPRICEgt1.25lt/PRICEgt
- lt/ITEMgt
- lt/ORDERSgt
- lt/CUSTOMERgt
15Referencias a entidades
- Las referencias a entidades sirven para insertar
un determinado contenido definido previamente. - lt!ENTITY Empresa Universidad de Deustogt
- ltpiegtCreado por Empresalt/piegt
16Códigos de escape
- Existen 5 referencias a entidades predefinidas
- amp el carácter
- lt el carácter lt
- gt el carácter gt
- apos el carácter
- quot el caracter
- Se incluyen los caracteres del juego ISO 10646.
- 145
- x2F31
17Secciones CDATA
- Las secciones CDATA (character data) contienen
texto que no debe ser procesado. - Se tratan como una secuencia de caracteres sin
estructura. - lt!CDATAltsaludogtHola, mundo!lt/saludogtgt
18Gramá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
19Document Type Definitions (DTDs)
- Especifican la estructura y sintaxis de un
documento XML - Labgroups.dtd
- lt!ELEMENT lab_group (student_name)gt
- lt!ELEMENT student_name (PCDATA)gt
- lt!ATTLIST student_name
- dni ID REQUIRED
- tutor IDREF IMPLIEDgt
20Document Type Definitions (cont)
- lt?xml version"1.0"?gt
- lt!DOCTYPE mensaje SYSTEM labgroups.dtd"gt
- ltlab_groupgt
- ltstudent_name dni44670523"gt
- Josu Artaza
- lt/student_namegt
- ltstudent_name dni44543211"gt
- Nuria Buruaga
- lt/student_namegt
- ltstudent_name dni23554521"
tutor33456211"gt - Inga Dorsman
- lt/student_namegt
- lt/lab_groupgt
21XML 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.
22Ejemplo Schema
- DTD
- lt!ELEMENT text (PCDATA emph name)gt
- lt!ATTLIST text timestamp NMTOKEN REQUIREDgt
- XML Schema
- ltxsdelement name"text"gt
- ltxsdcomplexType mixed"true"gt
- ltxsdsequencegt
- ltxsdelement ref"emph"/gt
- ltxsdelement ref"name"/gt
- lt/xsdsequencegt
- ltxsdattribute name"timestamp"
type"xsddate" use"required"/gt - lt/xsdcomplexTypegt
- lt/xsdelementgt
23Ejemplo Schema (cont)
- XML Document
- lt?xml version"1.0"?gt
- lttext timestamp"084500.000"gtThe deadline of
ltnamegtISO3 assigmentlt/namegt is ltemphgtNovember
21th 2003lt/emphgt. - lt/textgt
24XML 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)
25Reglas 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 - ...
26Reglas 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. - lt!DOCTYPE saludo SYSTEM saludo.dtdgt
- lt!DOCTYPE saludo PUBLIC -//Saludos//DTD Lenguaje
de saludos//ES http//www.deusto.es/dtds/saludo.
dtdgt - También se puede insertar el DTD entero en ese
punto, en lugar de referenciar al fichero.
27Proceso de validación documento XML
28XML 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.
29Ejemplo XML Namespaces
- lt?xml version"1.0"?gt
- lt!DOCTYPE mensaje SYSTEM "mensaje.dtd"gt
- ltmensajegt
- ltremitegt
- ltdirdireccion xmlnsdirhttp//www.deusto.es/d
irecciongt - ltdircallegtAvda. Universidadeslt/dircallegt
- ltdirlocalidad cp40007gtBilbaolt/dirlocalidad
gt - lt/dirdirecciongt
- ltnombregtAlfredo Reinolt/nombregt
- ltemailgtalf_at_ibium.comlt/emailgt
- lt/remitegt
- lt!-- Resto del mensaje XML... --gt
- lt/mensajegt
30Lenguajes 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)
31Herramientas 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 Xerces (www.apache.org)
- XML Validators
- Verifican que XML es válido
- XML.com's Validator based on Lark (xml.com)
32Por 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
33XML Parsing
34XML 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
35Simple 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á
enhttp//www.megginson.com/SAX/Java/index.html
36Caracterí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
37Cómo funciona SAX?
38SAX2/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/mhk
ay/saxon/ - Oracle XML Developer's Kit for Javahttp//technet
.oracle.com/tech/xml/xdk_java.html - ParserAdapterhttp//www.megginson.com/SAX/Java/in
dex.html
39Java 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
- Entity Resolver maneja entidades externas
- DTDHandler maneja eventos de DTD
- ContentHandler maneja contenido de un documento
- ErrorHandler maneja errores
40Arquitectura Java JAXP
41EntityResolver 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)
42ErrorHandler
- 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.
43ContentHandler
- 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
44DefaultHandler
- 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
45Ejemplo SAX Parsing I
- lt?xml version"1.0"?gt
- ltCarteleraCinegt
- ltPelicula codigo'2' titulo'Los Otros'
- director'Alejandro Amenabar'
- actores'Nicole Kidman'gt
- ltSesiongt1600lt/Sesiongt
- ltSesiongt1900lt/Sesiongt
- ltSesiongt2200lt/Sesiongt
- lt/Peliculagt
- ltPelicula codigo'5' titulo'Malena'
- director'Giuseppe Tornatore'
- actores'Monica Bellucci, Giuseppe
Sulfaro'gt - ltSesiongt1630lt/Sesiongt
- ltSesiongt1900lt/Sesiongt
- lt/Peliculagt
- lt/CarteleraCinegt
46Ejemplo SAX Parsing II
- import java.util.Vector
- // Imports de JAXP API
- import javax.xml.parsers.SAXParserFactory
- import javax.xml.parsers.ParserConfigurationExcept
ion - 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
47Ejemplo SAX Parsing III
- public SesionCineSAXParser(String url)
- // Obtener referencia al parser factory
- SAXParserFactory factory SAXParserFactory.newI
nstance() - // 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()
-
48Ejemplo SAX Parsing IV
- public void startElement(String namespaceURI,
String lName, - String qName,Attributes
attrs) - throws SAXException
- // lname --gt contiene el nombre local (sin
prefijo), o el string vacio - // si procesamiento de namespaces no se lleva a
cabo. - // qname --gt 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 ""
49Ejemplo 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() -
-
50Ejemplo 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.textoSes
ion) -
51Ejemplo SAX Parsing VII
- // Método para recuperar vector con
- // objetos SesionesPelicula creados
- // en parsing
- public Vector getSesionesPeliculas()
- return this.sesionesPeliculas
52W3C 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 Bindinghttp//www.w3.org/TR/DO
M-Level-2-Core/java-binding.html
53Caracterí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
54W3C 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
55Objetos 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
56Documento XML como un árbol de nodos
- lt?xml version"1.0" encoding"UTF-8"?gt
- ltDOCUMENTgt
- ltGREETINGgtHello from XMLlt/GREETINGgt
- ltMESSAGEgtWelcome to Programing XML in
Javalt/MESSAGEgt - lt/DOCUMENTgt
57Documento XML como un árbol de nodos (cont)
58JAXP 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 DocumentBuilderFacto
ry.newInstance() - // Crear nueva instancia de DOMBuilder
- DocumentBuilder parser fact.newDocumentBuilder()
59Clase DocumentBuilder
- Método parse() analiza fichero entrada
- Método Document getDocument() devuelve el
documento generado durante parsing - parser.parse(fich)
- Document doc parser.getDocument()
60Mé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
raiz el documento - Element getElementById(String elementId)Devuelve
el elemento identificado por elementoId - NodeList getElementsByTagName(String
tagname)Devuelve una lista de elementos
identificados por el nombre de etiqueta dado
61Mé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
62Mé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
63Ejemplo DOM I
- lt?xml version"1.0" encoding"iso-8859-1"?gt
- ltPeliculasgt
- ltPelicula codigo'1' titulo'Lo que el viento
se llevó' - director'Victor Fleming'
- actores'Clark Gable, Vivien
Leigh, Leslie Howard'/gt - ltPelicula codigo'2' titulo'Los Otros'
- director'Alejandro Amenabar'
- actores'Nicole Kidman'/gt
- ltPelicula codigo"5" titulo"Malena"
- director"Giuseppe Tornatore"
- actores"Monica Bellucci,
Giuseppe Sulfaro"/gt - lt/Peliculasgt
64Ejemplo DOM II
65Ejemplo DOM III
- import 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.newDocumentBuild
er() - parser.parse(fich)
- Document doc parser.getDocument()
- EjemploDOM.tratarNodo(doc)
- ...
-
66Ejemplo DOM IV
- public 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
-
67Ejemplo DOM V
- case Node.DOCUMENT_NODE
- System.out.println("ltxml version\"1.0\"gt")
- Document doc (Document)nodo
- tratarNodo(doc.getDocumentElement())
- break
68Ejemplo DOM VI
- case Node.ELEMENT_NODE
- String nombre nodo.getNodeName()
- System.out.print("lt" nombre)
- NamedNodeMap ats nodo.getAttributes()
- for (int i0 iltats.getLength() i)
- tratarNodo(ats.item(i))
-
- System.out.println("gt")
- NodeList hijos nodo.getChildNodes()
- ... // tratar los hijos recursivamente
- break
- case Node.ATTRIBUTE_NODE
- System.out.print(" " nodo.getNodeName()
"\"" nodo.getNodeValue() "\"")
69Ejemplo DOM VII
- case 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")
70Extensible 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.
71Extensible 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/xsl
t
72Operaciones entre árboles en XSL
73Ventajas 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
74Usando 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)
75Documento XML (students.xml)
- lt?xml version"1.0"?gt
- ltcoursegt
- ltname id"csci_2962"gtProgramming XML in
Javalt/namegt - ltteacher iddi"gtDiego Ipiñalt/teachergt
- ltstudent idua"gt
- ltnamegtUsue Artazalt/namegt
- lthw1gt30lt/hw1gt
- lthw2gt70lt/hw2gt
- ltprojectgt80lt/projectgt
- ltfinalgt85lt/finalgt
- lt/studentgt
- ltstudent idiu"gt
- ltnamegtIñigo Urrutialt/namegt
- lthw1gt80lt/hw1gt
- lthw2gt90lt/hw2gt
- ltprojectgt100lt/projectgt
- ltfinalgt40lt/finalgt
- lt/studentgt
- lt/coursegt
76Hoja de estilo XSLT (students.xsl)
- lt?xml version"1.0"?gt
- ltxslstylesheet version"1.0 xmlnsxsl"http//ww
w.w3.org/1999/XSL/Transform"gt - ltxsltemplate match"course"gt
- ltHTMLgt
- ltHEADgtltTITLEgtName of studentslt/TITLEgtlt/HEADgt
- ltBODYgt
- ltxslapply-templates select"student"/gt
- lt/BODYgt
- lt/HTMLgt
- lt/xsltemplategt
- ltxsltemplate match"student"gt
- ltPgtltxslvalue-of select"name"/gtlt/Pgt
- lt/xsltemplategt
- lt/xslstylesheetgt
77Resultado de transformación
- (students.html)
- ltHTMLgt
- ltHEADgt ltTITLEgtName of studentslt/TITLEgt lt/HEADgt
- ltBODYgt
- ltPgtUsue Artazalt/Pgt
- ltPgtIñigo Urrutialt/Pgt
- lt/BODYgt
- lt/HTMLgt
78Formas 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.
79Aplicaciones usando XSLT
80Ejemplos de Procesadores XSLT existentes
- Oracle XML parser for Javahttp//technet.oracle.c
om/tech/xml/parser_java2/ - Saxonhttp//users.iclway.co.uk/mhkay/saxon/index.
html - XThttp//www.jclark.com/xml/xt.html
- Sablotronhttp//www.gingerall.com/charlie-bin/get
/webGA/act/sablotron.act - Microsoft XML Parserhttp//msdn.microsoft.com/dow
nloads/webtechnology/xml/msxml.asp - Xalan Javahttp//xml.apache.org/xalan-j/index.htm
l - Java JAXP
81XSLT son documentos XML bien formados
- xslstylesheet elemento raiz
- xsltemplate 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 xslapply-templates. Aplica los
templates definidos para los hijos de un nodo
seleccionado
82Ejemplo XSLT
- lt?xml version"1.0"?gt
- ltxslstylesheet version"1.0"
xmlnsxsl"http//www.w3.org/1999/XSL/Transform"gt
- ltxsltemplate match"/"gt
- ltxslapply-templates/gt
- lt/xsltemplategt
- lt/xslstylesheetgt
83Elementos XSLT
- xslvalue-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 - ltxsltemplate matchcourse"gt
- ltxslvalue-of selectstudent"/gt
- lt/xsltemplategt
- Si queremos seleccionar varios podemos hacer
- ltxsltemplate matchcourse"gt
- ltxslapply-templates selectstudent"/gt
- lt/xsltemplategt
- ltxsltemplate matchstudent"gt
- ltxslvalue-of select"."/gt
- lt/xsltemplategt
- O usar xslfor-each
- ltxsltemplate matchcourse"gt
- ltxslfor-each selectstudent"gt
- ltxslvalue-of select"."/gt
- lt/xslfor-eachgt
- lt/xsltemplategt
84Elementos XSLT (cont)
- Para realizar distintos procesamientos en función
de los datos se usa xslchoose - Se compone de elementos xslwhen
- Un elemento opcional xslotherwise
- Para procesar o no un elemento en función de una
condición se usa xslif - Condición en atributo test
85Ejemplo
- lt?xml version"1.0"?gt
- ltxslstylesheet version"1.0" xmlnsxsl"http//ww
w.w3.org/1999/XSL/Transform"gt - ltxsltemplate match"/"gt
- ltHTMLgt
- ltHEADgt ltTITLEgtName of studentslt/TITLEgt
lt/HEADgt - ltBODYgt
- ltxslapply-templates/gt
- lt/BODYgt
- lt/HTMLgt
- lt/xsltemplategt
- ltxsltemplate match"course"gt
- ltxslapply-templates select"student"/gt
- lt/xsltemplategt
- ltxsltemplate match"student"gt
- ltxslfor-each select"name"gtltPgtltxslvalue-of
select"."/gtlt/Pgtlt/xslfor-eachgt - lt/xsltemplategt
- lt/xslstylesheetgt
86Patrones XPath para el atributo match o select
- Seleccionar el nodo raiz
- ltxsltemplate match"/"gt ... lt/xsltemplategt
- Seleccionar un elemento
- ltxsltemplate match"student"gt ...lt/xsltemplategt
- Seleccionar hijos de un elemento
- ltxsltemplate match"course/student"gt ...
lt/xsltemplategt - ltxsltemplate match"course//name"gt ...
lt/xsltemplategt - Seleccionar descendientes de un elemento
- ltxsltemplate match"course//name"gt ...
lt/xsltemplategt
87Patrones XPath para el atributo match o select
- Seleccionar atributo título
- ltxslvalue-of select"./_at_id"/gt
- Seleccionar comentarios
- ltxsltemplate match"comment()"gt ...
lt/xsltemplategt - Seleccionar elementos de texto
- ltxsltemplate match"text()"gt ... lt/xsltemplategt
- Recuperar posición que ocupa un sub-elemento
dentro de elemento padre - ltxslvalue-of select"position()"/gt
88Evaluando condiciones con
- Evaluando si una condición es cierta
- Si el elemento estudiante tiene un hijo name
- ltxsltemplate match"studentname"gt
- Cualquier elemento que tiene un elemento namE
- ltxsltemplate match"name"gt
- Elemento student tiene un sub-elemento hw1 o hw2
element - ltxsltemplate match"studenthw1 hw2"gt
89Ejemplo XSLT
- Problema Imprimir nombre de alumnos con nota
media mayor de 65 - lt?xml version"1.0"?gt
- ltxslstylesheet version"1.0"
- xmlnsxsl"http//www.w3.org/1999/XSL/T
ransform"gt - ltxsloutput method"text"/gt
- ltxsltemplate match"course"gt
- ltxslapply-templates select"student"/gt
- lt/xsltemplategt
- ltxsltemplate match"student"gt
- ltxslvariable name"ave"gt
- ltxslvalue-of select"(hw1 hw2
project final) div 4"/gt - lt/xslvariablegt
- ltxslif test"ave gt 65"gt
- Student name"ltxslvalue-of select"name"/gt"
average"ltxslvalue-of select"ave"/gt" - lt/xslifgt
- lt/xsltemplategt
- lt/xslstylesheetgt
90Resultado transformación
- Salida (grades70.txt)
- Student nameUsue Artaza" average"66,25"
- Student nameIñigo Urrutia" average"77,5"
91Java 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
92Usando Java JAXP
- import 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.TransformerConfiguratio
nException - import javax.xml.transform.dom.DOMSource
- import javax.xml.transform.stream.StreamSource
- import javax.xml.transform.stream.StreamResult
- import org.w3c.dom.Document
- ...
93Usando 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//localhost8080/cartelera/Cines.jsp?Funcion
TodaCartelera") - // Generar un objeto transformer para
realizar transform XSL - TransformerFactory tFactory
TransformerFactory.newInstance() - StreamSource stylesource new
StreamSource( - "http//localhost8080/cartelera/C
artelera.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()
94Ejemplo XML XSL ? XHTML I
- lt?xml version"1.0" encoding"iso-8859-1"?gt
- ltCarteleragt
- ltCine codigo'1' nombre'Coliseo Java'
direccion'Avda. Abaro' poblacion'Portugalete'gt - ltPelicula codigo'1' titulo'Lo que el
viento se llevó' - director 'Victor Fleming '
- actores 'Clark Gable,
Vivien Leigh, Leslie Howard 'gt - ltSesiongt1600lt/Sesiongt
- ltSesiongt1930lt/Sesiongt
- ltSesiongt2200lt/Sesiongt
- lt/Peliculagt
- ltPelicula codigo'5' titulo'Malena'
- director'Giuseppe
Tornatore' - actores'Monica Bellucci,
Giuseppe Sulfaro'gt - ltSesiongt1630lt/Sesiongt
- ltSesiongt1900lt/Sesiongt
- lt/Peliculagt
- lt/Cinegt
-
- lt/Carteleragt
95Ejemplo XML XSL ? XHTML II
- lt?xml version"1.0" encoding"iso-8859-1"?gt
- ltxslstylesheet xmlnsxslhttp//www.w3.org/1999/X
SL/Transform version"1.0"gt - ltxsloutput method"html"/gt
- ltxsltemplate match"/"gt
- lthtmlgt
- ltheadgt
- ltstyle type"text/css"gt
- table font-family
arial, 'sans serif' margin-left 15pt - th,td font-size 80
- th background-colorFAEB
D7 - lt/stylegt
- lt/headgt
- ltbodygt
- lttable border"1"gt
- ltxslapply-templates/gt
- lt/tablegt
- lt/bodygt
- lt/htmlgt
- lt/xsltemplategt
96Ejemplo XML XSL ? XHTML III
- ltxsltemplate match"Cartelera"gt
- ltxslfor-each select"Cine"gt
- lttrgt
- ltthgtltxsltextgtCinelt/xsltextgtlt
/thgt - ltthgtltxsltextgtDirecciónlt/xslt
extgtlt/thgt - ltthgtltxsltextgtPoblaciónlt/xslt
extgtlt/thgt - ltthgtlt/thgt
- lt/trgt
- lttrgt
- lttdgtltxslvalue-of
select"./_at_nombre"/gtlt/tdgt - lttdgtltxslvalue-of
select"./_at_direccion"/gtlt/tdgt - lttdgtltxslvalue-of
select"./_at_poblacion"/gtlt/tdgt - lttdgtltxsltextgtlt/xsltextgtlt/tdgt
- lt/trgt
- ltxslfor-each select"Peliculagt
- lttrgt
- ltthgtlt/thgt
- ltthgtltxsltextgtPelículalt/xs
ltextgtlt/thgt - ltthgtltxsltextgtDirectorlt/xs
ltextgtlt/thgt
97Ejemplo XML XSL ? XHTML IV
- lttrgt
- ltthgtlt/thgt
- ltthgtlt/thgt
- ltthgtltxsltextgtSesiónlt/xslte
xtgtlt/thgt - ltthgtltxsltextgtHoralt/xsltext
gtlt/thgt - lt/trgt
- ltxslfor-each select"Sesion"gt
- lttrgt
- lttdgtltxsltextgtlt/xsltext
gtlt/tdgt - lttdgtltxsltextgtlt/xsltext
gtlt/tdgt - lttdgtltxslvalue-of
select"position()"/gtlt/tdgt - lttdgtltxslvalue-of
select"."/gtlt/tdgt - lt/trgt
- lt/xslfor-eachgt
- lt/xslfor-eachgt
- lt/xslfor-eachgt
- lt/xsltemplategt
- lt/xslstylesheetgt
98Ejemplo XML XSL ? XHTML V
- lthtmlgt
- ltbodygt
- lttable border"1"gt
- lttrgt
- ltthgtCinelt/thgt
- ltthgtDireccioacutenlt/thgt
- ltthgtPoblacioacutenlt/thgt
- ltthgtlt/thgt
- lt/trgt
- lttrgt
- lttdgtColiseo Javalt/tdgt
- lttdgtAvda. Abarolt/tdgt
- lttdgtPortugaletelt/tdgt
- lttdgtlt/tdgt
- lt/trgt
- lttrgt
- ltthgtlt/thgt
- ltthgtPeliacuteculalt/thgt
- ltthgtDirectorlt/thgt
99Ejemplo XML XSL ? XHTML VI
- lttrgt
- lttdgtlt/tdgt
- lttdgtLo que el viento se
llevoacutelt/tdgt - lttdgtSantiago Seguralt/tdgt
- lttdgtBo Derek, Al Pacino, Robert
Refordlt/tdgt - lt/trgt
- lttrgt
- ltthgtlt/thgt
- ltthgtlt/thgt
- ltthgtSesioacutenlt/thgt
- ltthgtHoralt/thgt
- lt/trgt
- lttrgt
- lttdgtlt/tdgt
- lttdgtlt/tdgt
- lttdgt1lt/tdgt
- lttdgt1600lt/tdgt
- lt/trgt
- lttrgt
100Resultado procesamiento XSLT