Beruflich Dokumente
Kultur Dokumente
zip
Tecnologa XML
Dr. Diego Lz. de Ipia Gz. de Artaza dipina@eside.deusto.es http://paginaspersonales.deusto.es/dipina
Contenidos
XML
DTD Schema
XML Parsing
SAX API DOM API
XSLT
2
Qu es XML?
eXtensible Mark-up Language. Es un metalenguaje que permite disear otros lenguajes (WML, MathML, XHTML,..). Cualquiera puede desarrollar su propio lenguaje de etiquetas adecuado al tipo de aplicacin que ms le convenga. En realidad hay muchas tecnologas basadas en XML (XPath, XLink, XPointer, XSL, ...). XML 1.0 Specification http://www.w3.org/TR/REC-xml
3
HTML y XML
SGML (Standard Generalized Markup Language) HTML es una aplicacin de SGML XML es subconjunto ms fcil de usar de SGML XHTML es una aplicacin de XML
Ventajas XML
Una de las mayores utilidades de XML es poder etiquetar los datos con su significado (self-describing data). Permite la estructuracin de la informacin. Ello lleva el tratamiento automtico de la informacin a lmites insospechados. XML es la base de la nueva generacin de aplicaciones web intercambio de datos
7
Usos XML
Sitios web
Permite separar contenido y presentacin
Instrucciones de procesamiento
Las PI son instruccciones para el procesador del documento XML. Siempre hay al menos una PI, que pertenece al prlogo del documento:
<?xml version="1.0"?> <saludo> Hola, mundo! </saludo>
10
Comentarios en XML
Los comentarios no se procesan. Tienen la siguiente sintaxis:
<!-- Esto es un comentario -->
11
12
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>
15
Cdigos de escape
Existen 5 referencias a entidades predefinidas:
& el carcter & < el carcter < > el carcter > ' el carcter ` " el caracter
16
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>]]>
17
Gramticas en XML
La gramtica que restringe los elementos vlidos dentro de un nuevo derivado de XML puede expresarse en forma de:
DTD (Document Type Definitions) o Esquemas XML
18
<!ELEMENT lab_group (student_name)*> <!ELEMENT student_name (#PCDATA)> <!ATTLIST student_name dni ID #REQUIRED tutor IDREF #IMPLIED>
19
20
XML Schemas Los DTD no son muy potentes para definir gramticas. Otra forma de hacerlo es con Esquemas XML basados en el propio XML y que soporta ms tipos de datos.
21
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>
22
ser bien formados, siguen las reglas de una gramtica (definida en un DTD o XML Schema)
24
25
Tambin se puede insertar el DTD entero en ese punto, en lugar de referenciar al fichero.
26
DTD?
Procesamiento de la informacin
(opcional)
no
si si
DTD
Valid?
no
27
XML Namespaces
El estndar XML tambin define los espacios de nombres (XML Namespaces). Permiten que un mismo documento XML tenga etiquetas de diferentes lenguajes (definidas en diferentes gramticas DTD). As es posible mezclar ms informacin en los documentos, por ejemplo, aadir informacin semntica a un documento XHTML.
28
29
Herramientas de XML
Editores XML parsers
http://www.xmlcooktop.com/ XML Spy, www.xmlspy.com gratis
Lee un documento XML Verifica que XML est bien formado Verifican que XML es vlido
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
XML Parsing
Documento XML Aplicacin XML
Parser XML
33
DOM
Provee una representacin de un documento XML en forma de un rbol Carga todo el documento XML en memoria http://www.w3.org/DOM
34
Caractersticas de SAX
Analizador o parser SAX:
Detecta cundo 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 anlisis Desventaja: no disponemos de la estructura en rbol de los documentos
36
startElement & characters startElement & characters endElement startElement startElement & characters startElement & characters endElement endElement & endDocument37
38
Java JAXP
Define clase SAXParserFactory para crear una instancia de un objeto SAXParser (independiente de implementacin 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
39
40
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)
41
ErrorHandler
void error(SAXParserException exception)
Recibe notificacin de error recuperable.
ContentHandler
void characters(char[] ch, int start, int length)
Recibe notificacin de caracteres encontrados dentro de un elemento.
void endDocument()
Recibe notificacin de final de documento.
void startDocument()
Recibe notificacin de comienzo de documento.
DefaultHandler
Manejador de contenido que define una serie de mtodos 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 mtodos callback de los 4 manejadores de SAX2:
EntityResolver DTDHanler ErrorHandler ContentHandler
44
46
48
50
51
Caractersticas DOM
Documento se carga totalmente en memoria en una estructura de rbol de la jerarqua de elementos, as como modificar el contenido de los documentos e incluso crearlos desde cero.
53
54
55
56
57
JAXP DOM
API JAXP de J2SE provee independencia del analizador Para conseguir una instancia de analizador DOM a travs 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();
58
Clase DocumentBuilder
Mtodo parse() analiza el fichero entrada Mtodo Document getDocument() devuelve el documento generado durante parsing
parser.parse(fich); Document doc = parser.getDocument();
59
60
61
NamedNodeMap
int getLength() Devuelve nmero 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 coleccin
62
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>
63
Ejemplo DOM II
64
Ejemplo 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; } } 66
Ejemplo DOM V
case Node.DOCUMENT_NODE: System.out.println("<xml version=\"1.0\">"); Document doc = (Document)nodo; tratarNodo(doc.getDocumentElement()); break;
67
Ejemplo DOM VI
case 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() +"\"");
68
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
71
72
Desventajas:
Su utilizacin es ms compleja que un lenguaje de programacin convencional Consume cierta memoria y capacidad de proceso DOM detrs
73
74
75
Resultado de transformacin
(students.html) <HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD> <BODY> <P>Usue Artaza</P> <P>Iigo Urrutia</P> </BODY> </HTML>
77
78
JSP
Arquitectura en 5 capas dnde el servidor contiene conversores XSLT para generar presentacin en distintos formatos.
Elemento xsl:apply-templates. Aplica los templates definidos para los hijos de un nodo seleccionado
81
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>
82
Elementos XSLT
xsl:value-of permite recuperar el valor de un nodo
<xsl:template match=course"> <xsl:value-of select=student"/> </xsl:template>
Los nodos son seleccionados usando la sintxis de la especificacin XPath XML Slo selecciona el valor del primer estudiante que encuentre
O usar xsl:for-each
<xsl:template match=course"> <xsl:for-each select=student"> <xsl:value-of select="."/> </xsl:for-each> </xsl:template>
83
84
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>
85
86
Seleccionar comentarios:
<xsl:template match="comment()"> ... </xsl:template>
Ejemplo XSLT
Problema: 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:valueof select="$ave"/>" </xsl:if> </xsl:template> </xsl:stylesheet> 89
Resultado transformacin
Salida (grades70.txt): Student name=Usue Artaza" average="66,25" Student name=Iigo Urrutia" average="77,5"
90
Java JAXP
Provee clase Transformer para la aplicacin de XSL a un documento XML Como siempre Java JAXP asegura que el cdigo fuente sea el mismo independientemente del parser XSLT subyacente
91
XHTML
<?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>
94
XHTML
<?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>
95
XHTML
<xsl:template match="Cartelera"> <xsl:for-each select="Cine"> <tr> <th><xsl:text>Cine</xsl:text></th> <th><xsl:text>Direccin</xsl:text></th> <th><xsl:text>Poblacin</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>Pelcula</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>
96
XHTML
<tr> <th></th> <th></th> <th><xsl:text>Sesin</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>
97
XHTML
98
XHTML
<tr> <td></td> <td>Lo que el viento se llevó</td> <td>Santiago Segura</td> <td>Bo Derek, Al Pacino, Robert Reford</td> </tr> <tr> <th></th> <th></th> <th>Sesión</th> <th>Hora</th> </tr> <tr> <td></td> <td></td> <td>1</td> <td>16:00</td> </tr> <tr> ... </table> <body> </html>
99
100