Tecnologías XML http://www.it.uc3m.es/pedmume/
XML: Introducción XML es un formato para almacenamiento y estructuración de datos que se encuentra en ficheros de texto Un conjunto de datos de una base de datos puede ser pasado a XML y viceversa Algunos usos de XML Información de usuarios, productos, cosas, etc. Descripción de comportamiento o procesos Descripción de protocolos de comunicaciones Descripción de lenguajes 2
XML: Reglas Básicas de Formación Un fichero XML debe seguir las siguientes reglas Empezar por la línea <?xml version="1.0"?> Todo elemento en XML tiene un delimitador de inicio y otro de fin y puede tener atributos asociados Inicio: <nombre_elemento atributo1= valor1 atributo2= valor2 > Fin: </nombre_elemento> Se tiene un único elemento raíz El elemento raíz puede tener en su interior un número indefinido de elementos anidados (implica que los elementos que haya en su interior sus delimitadores de inicio y fin estarán dentro del delimitador de inicio y fin del elemento raíz) así como texto Cualquier elemento puede tener en su interior un número indefinido de elementos anidados, así como texto Para insertar comentarios: <!-- Comentario insertado --> 3
XML: Reglas Adicionales de Formación Un fichero XML debe además seguir las siguientes reglas Se pueden escapar caracteres para que no se interpreten como caracteres especiales del fichero XML <(<), > (>), & (&), (&apos), (") <![CDATA[" texto que no será interpretado"]]> Cualquier elemento puede llevar un atributo especial que sirve para definir espacios de nombres. Sirve para poder tener diferentes vocabularios XML de diferentes fuentes. La forma es la siguiente <nombre_elemento xmlns= URIdefecto xmlns:n1= URI1 xmnls:n2= URI2 > Otros elementos que estén contenidos en aquel donde se definió un espacio de nombres, llevarán el nombre del espacio de nombres precediendo al elemento (<n1:nombre_elemento>), excepto el definido por defecto que no lleva nada 4
XML: Reglas de Nombres y de Convención Cualquier nombre de elemento XML debe seguir las siguientes reglas Los nombres no pueden contener espacios No pueden empezar con signos de puntuación ni con ciertas palabras reservadas Los valores de sus atributos deben ir o bien entre comillas simples o bien entre comillas dobles Son sensibles a las letras mayúsculas y minúsculas Ciertas convenciones en los nombres de elementos y atributos Se suelen indentar los diferentes elementos anidados a la hora de escribirse 5
XML: Ejemplo <?xml version="1.0"?> <alimentos xmlns= http://www.it.uc3m.es/pedmume/a xmlns:carne= http://www.it.uc3m.es/pedmume/b xmlns:legumbres= http://www.it.uc3m.es/pedmume/c xmlns:garbanzos= http://www.it.uc3m.es/pedmume/d > <carne id= 3 > La carne que vendemos es la siguiente: <carne:ternera> <carne:tipo> filete </carne:tipo> <preparacion> guisada </preparacion> </carne:ternera> </carne> <legumbres id= 7 > Las legumbres que vendemos son las siguientes: <legumbres:lentejas> <preparacion> guisada </preparacion> </legumbres:lentejas> <legumbres:garbanzos> <procedencia> <garbanzos:casa_mayor/></procedencia> <preparacion> guisada </preparacion> </legumbres:garbanzos> </legumbres> </alimentos > 6
XML como un Árbol Todo fichero XML puede ser visto como un árbol en el que cada elemento puede contener otros de una manera jerárquica Cualquier realidad se puede modelar como un árbol. Técnicas orientadas a objetos pueden facilitar la tarea Si definimos nodo XML como cualquier elemento, atributo o texto, entonces son nodos hoja los siguientes Todos los atributos porque no pueden contener nada más ellos mismos Todos los textos porque no pueden contener nada más ellos mismos Los elementos que no tienen otros elementos ni atributos ni texto contenidos en ellos 7
XML: Ejemplo de Árbol alimentos id carne legumbres id Texto 1 Texto 2 carne:ternera legumbres: lentejas legumbres: garbanzos carne:tipo preparacion preparacion preparacion Texto 3 Texto 4 Texto 5 garbanzos: procedencia Texto 6 garbanzos: CasaMayor 8
XML: Ejemplo de Utilidad de Datos <?xml version="1.0"?> <alimentos xmlns= http://www.it.uc3m.es/pedmume/a xmlns:carne= http://www.it.uc3m.es/pedmume/b xmlns:legumbres=http://www.it.uc3m.es/pedmume/c xmlns:garbanzos= http://www.it.uc3m.es/pedmume/d > <carne id= 3 > La carne que vendemos es la siguiente: <carne:ternera> <carne:tipo> filete </carne:tipo> <preparacion> guisada </preparacion> </carne:ternera> </carne> <legumbres id= 7 > Las legumbres que vendemos son las siguientes: <legumbres:lentejas> <preparacion> guisada </preparacion> </legumbres:lentejas> <legumbres:garbanzos> <procedencia> <garbanzos:casa_mayor/></procedencia> <preparacion> guisada </preparacion> </legumbres:garbanzos> </legumbres> </alimentos > 9
XML: Ejemplo de Utilidad de Comportamiento <?xml version="1.0" encoding="utf-8"?> <wsdl:definitions targetnamespace="urn:datos" xmlns=http://schemas.xmlsoap.org/wsdl/> <wsdl:message name="setresponse > <wsdl:part name="setreturn" type="xsd:string"/> </wsdl:message> <wsdl:message name="setrequest"> <wsdl:part name="in0" type="xsd:string"/> <wsdl:part name="in1" type="xsd:string"/> <wsdl:part name="in2" type="xsd:string"/> </wsdl:message> <wsdl:porttype name="datos"> <wsdl:operation name="set" parameterorder="in0 in1 in2"> <wsdl:input message="impl:setrequest" name="setrequest"/> <wsdl:output message="impl:setresponse" name="setresponse"/> </wsdl:operation> </wsdl:porttype>.. </wsdl:definitions> 10
XML: Ejemplo de Utilidad de Protocolo: SOAP de respuesta <?xml version="1.0" encoding="utf-8"?> <soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> <soapenv:body> <setresponse soapenv:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"> <setreturn xsi:type="xsd:string">ok</setreturn> </setresponse> </soapenv:body> </soapenv:envelope> 11
XML: Comparación con Bases de Datos y HTML XML vs Bases de Datos Se puede representar lo mismo, de hecho hay bases de datos basadas en XML XML posibilita la interoperabilidad, el reuso, la compartición, el intercambio, etc. XML vs HTML XML no está orientado a la presentación de contenidos sólo a la estructura, mientras que HTML incluye cuestiones de presentación. XML contiene datos, HTML mezcla datos y presentación 12
XMLSchema: XSD Además de las reglas que un fichero XML debe cumplir por el hecho de ser XML, se pueden describir más reglas relativas a: Los tipos de datos que tendrán los elementos y los atributos Qué elementos puede contener otro elemento y qué combinaciones son posibles (orden, número, etc.) Si un nodo puede o no contener texto Este establecimiento de reglas adicionales se realizan mediante descripciones textuales, siendo metalenguajes que describen otros lenguajes DTD. Ficheros con extensión dtd XML Schema. Es XML también. Ficheros con extensión xsd 13
XMLSchema: Tipos de datos simples Números: xs:int, xs:integer, xs:decimal, xs:long, xs:short, xs:double, xs:float, xs:byte, etc. Strings: xs:string, xs:id, xsd:idref, xsd:token, xsd:normalizedstring, etc. Fechas: xs:date, xs:time, xs:datetime, xs:duration, etc. Booleanos: xs:boolean URIs: xs:anyuri 14
XMLSchema: Restricciones en los tipos de datos simples Los tipos de datos se pueden ajustar para concretar más cuales son los valores posibles del nuevo tipo de datos La manera de establecer restricciones en un tipoa <xs:simpletype name= tiposimpleconrestricciones > <xs:restriction base="xs:tipoa"> <!-- Por aquí se establecen las restricciones --> </xs:restriction> </xs:simpletype> Dentro de las etiquetas de restricción se pueden poner tantas etiquetas XSD de restricciones como se requieran El nuevo tipo definido se puede enlazar tanto para los elementos como los atributos 15
XMLSchema: Etiquetas de restricción xs:mininclusive, xs:minexclusive, xs:maxinclusive, xs:maxexclusive xs:length, xs:minlength, xs:totaldigits, xs:fractiondigits xs:enumeration xs:pattern xs:whitespace 16
XMLSchema: Tipos de Descripciones En el XMLSchema hay que describir: Atributos Elementos simples. No pueden contener ni atributos ni otros elementos. Sólo pueden contener texto Elementos complejos Elementos vacios. Sólo puede contener atributos Elementos que sólo pueden contener texto y atributos Elementos que sólo pueden contener otros elementos y atributos Elementos que pueden contener de todo: texto, atributos y otros elementos 17
XMLSchema: Descripción de atributos La manera básica es <xs:attribute name= nombre" type= tipo"/> El tipo puede ser por defecto o definido según restricciones Se pueden añadir atributos a la descripción de atributos default fixed use: puede ser optional o required que implica si es obligatorio o no el poner dicho atributo al elemento en cuestión. Por defecto es opcional si no se pone dicho parámetro 18
XMLSchema: Descripción de elementos simples La manera básica es <xs:element name= nombre" type= tiposimple"/> El tiposimple puede ser uno definido por defecto en la especificación o definido según restricciones Se pueden añadir atributos a la descripción de atributos default fixed 19
XMLSchema: Descripción de elementos vacios (con atributos) La manera básica es <xs:element name= nombre" type= idtipocomplejo"/> El idtipocomplejo enlaza a algo de la siguiente forma: <xs:complextype name= idtipocomplejo"> <xs:attribute name= nombre" type= tiposimple"/> <!-- Por aquí tantos atributos como sean necesarios--> </xs:complextype> 20
XMLSchema: Descripción de elementos con texto y atributos La manera básica es <xs:element name= nombre" type= idtipocomplejo"/> El idtipocomplejo enlaza a algo de la siguiente forma: <xs:complextype name= idtipocomplejo"> > <xs:simplecontent> <xs:extension base= tiposimple">... <!-- Por aquí tantos atributos como sean necesarios-->... </xs:restriction> </xs:simplecontent> </xs:complextype> El texto será del tiposimple definido 21
Descripción de elementos con otros elementos y atributos La manera básica es <xs:element name= nombre" type= idtipocomplejo"/> El idtipocomplejo enlaza a algo de la siguiente forma: <xs:complextype name= idtipocomplejo"> <xs:attribute name= nombre" type= tiposimple"/> <!-- Por aquí tantos atributos como sean necesarios--> <xs:sequence> <!-- Por aquí tantos otros elementos como sean necesarios--> </xs:sequence> </xs:complextype> No solo puede ser xs:sequence, también xs:all, xs:choice Cada elemento contenido puede tener xs:minoccurs, xs:maxoccurs 22
Descripción de elementos con otros elementos, atributos y texto Es como en el caso anterior, pero se incluye el atributo mixed al elemento <xs:complextype> y se le asigna el valor de true 23
Agrupaciones y Extensiones de elementos y atributos Un conjunto de elementos se pueden agrupar con <xs:group> y luego con el identificador del grupo se puede referenciar desde otro lado. El grupo deberá empezar con alguna etiqueta <xs:sequence>, <xs:all> o <xs:choice> Un conjunto de atributos se pueden agrupar con <xs:groupattributes> y luego con el identificador del grupo se puede referenciar desde otro lado De manera análoga, <xs:any> sirve para extender una definición con cualquier elemento, mientras que <xs:anyatributte> hace lo mismo para atributos 24
Ejemplo de XMLSchema a mejorar <?xml version="1.0" encoding="utf-16"?> <xsd:schema attributeformdefault="unqualified" elementformdefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/xmlschema"> <xsd:element name="alimentos" type="alimentostype" /> <xsd:complextype name="alimentostype"> <xsd:sequence> <xsd:element name="carne" type="carnetype" /> <xsd:element name="legumbres" type="legumbrestype" /> </xsd:sequence> </xsd:complextype> <xsd:complextype name="legumbrestype"> <xsd:sequence> <xsd:element name="legumbres:lentejas" type="legumbres:lentejastype" /> <xsd:element name="legumbres:garbanzos" type="legumbres:garbanzostype" /> </xsd:sequence> <xsd:attribute name="id" type="xsd:int" /> </xsd:complextype> <xsd:complextype name="legumbres:garbanzostype"> <xsd:sequence> <xsd:element name="procedencia" type="procedenciatype" /> <xsd:element name="preparacion" type="xsd:string" /> </xsd:sequence> </xsd:complextype> <xsd:complextype name="procedenciatype"> <xsd:sequence> <xsd:element name="garbanzos:casa_mayor" type="xsd:string" /> </xsd:sequence> </xsd:complextype> <xsd:complextype name="legumbres:lentejastype"> <xsd:sequence> <xsd:element name="preparacion" type="xsd:string" /> </xsd:sequence> </xsd:complextype> <xsd:complextype name="carnetype"> <xsd:sequence> <xsd:element name="carne:ternera" type="carne:terneratype" /> </xsd:sequence> <xsd:attribute name="id" type="xsd:int" /> </xsd:complextype> <xsd:complextype name="carne:terneratype"> <xsd:sequence> <xsd:element name="carne:tipo" type="xsd:string" /> <xsd:element name="preparacion" type="xsd:string" /> </xsd:sequence> </xsd:complextype> </xsd:schema> 25
Ejercicios Mejorar el XMLSchema anterior para hacer algo más significativo y diferenciando los diferentes espacios de nombres Hacer un XMLSchema para almacenar la información de la aplicación de gestor de actividades deportivas explicada en la sesión de bases de datos 26
XSLT: Introducción XSLT: EXtensible Stylesheet Language Idea general XML: Almacena datos y estructura XML Schema: Da las reglas de cómo formar documentos XML XSLT: Sirve para transformar documentos XML en otros documentos, como puede ser otros documentos XML con otro XML Schema, HTML, etc. CSS vs XSLT XSLT utiliza XPath para navegar por los diferentes elementos y atributos de un documento XML 27
XSLT: Etiquetas de inicio y enlace desde fichero XML Se empieza con la siguiente línea en el fichero XSL <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> El stylesheet se puede reemplazar por transform Desde un fichero XML, se le indica el fichero XSL que será tenido en cuenta para realizar la transformación <?xml-stylesheet type="text/xsl" href= nombrefichero.xsl"?> Es importante saber en cada momento en que nodo está el procesador en una transformación XSLT, en principio empezamos en el nodo raíz 28
XSLT: templates Define una plantilla que se aplicará a una serie de nodos para generar una determinada salida Sintaxis <xsl:template name= nombre1 match = patron priority = numero mode = nombre2>. </xsl:template> Explicación de parámetros name es el nombre de la plantilla y se puede referenciar match es una expresión XPath que indica el nodo o nodos a los que se aplicará la plantilla, que serán todos los que cumplan el patrón priority es un número entre -9 y 9, si varias coincidencias, lo de menos prioridad no se aplican mode permite procesar un elemento varias veces 29
XSLT: Introducción a expresiones XPath Es un lenguaje para poner expresiones que permiten localizar nodos en un documento XML La selección de nodos es parecida a cómo poner rutas en un sistema de ficheros Algunos operadores importantes / //... @ 30
XSLT: value-of Imprime el valor de texto del nodo seleccionado Sintaxis <xsl:value-of select = patron disable-output-escaping = "yes" "no > </xsl:value-of> Explicación de parámetros select. Obligatorio, tiene que ser una expresión XPath que indica el nodo a los que se aplicará el obtener el valor y mostrarlo. Si hay varios que lo cumplen, sólo se muestra el valor del primero de ellos Disable-output-escaping. Opcional. Por defecto vale No, pero si se indica como Yes entonces no se escapan los caracteres del atributo select 31
XSLT: for-each Selecciona una serie de nodos y realizará una pasada por el bucle por cada nodo, representando en cada pasada uno de dichos nodos seleccionados Sintaxis <xsl:for-each select = patron> </xsl:for-each> Explicación de parámetros select. Obligatorio, tiene que ser una expresión XPath que indica los nodos que va a recorrer. Por cada nodo seleccionado, se realizará una pasada por el bucle con su valor 32
XSLT: apply-templates Enlaza con la template que se debe aplicar para un conjunto de nodos Sintaxis <xsl:apply-templates select = patron mode = nombre> </xsl:apply-templates> Explicación de parámetros select. Opcional, tiene que ser una expresión XPath que indica los nodos a los que se va a aplicar el patrón. Por cada nodo seleccionado, se irá al patrón correspondiente indicado mode. Opcional, permite que se pueda procesar varias veces un elemento 33
XSLT: sort Ordena la lista de nodos desordenada obtenida por foreach o apply-templates Sintaxis <xsl:sort select = patron lang = { string } data-type = { "text" "number" nombre } order = { "ascending" "descending" } case- order = { "upper-first" "lower-first" } /> Explicación de parámetros más importantes select. Opcional, tiene que ser una expresión XPath que indica en base a que nodos se va a proceder a realizar la ordenación 34
XSLT: if Realiza un cierto procesado si se cumple una determinada condición Sintaxis <xsl:if test = boolean-expression> </xsl:if> Explicación de parámetros más importantes Test. Obligatorio, se pone una expresión de la que se valida su certeza o falsedad. Si es cierta, entonces se realiza el procesado adecuado. Algo se considera cierto cuando existe al menos un nodo que cumple la expresión 35
XSLT: choose, when, otherwise Realiza un cierto procesado si se cumple una determinada condición Sintaxis <xsl:choose> <xsl:when test="expression">... some output... </xsl:when> <xsl:otherwise>... some output... </xsl:otherwise> </xsl:choose> Se realiza aquel procesado tal que cumpla la condición, si hay varios se realiza el primero de ellos. Si no se cumple ninguno, se hará el de otherwise 36
XSLT: text Genera un nodo de texto Sintaxis <xsl:text disable-output-escaping = "yes" "no"> </xsl:text> 37
XSLT: Ejemplo <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <!--Generate the initial RDF headers--> <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> <!--Generate the different annotations of subject for each different resource--> <!--For every resource--> <xsl:for-each select="loms/results/lom"> <!--Write the description of a resource with some identifier given by the entry--> <xsl:text disable-output-escaping="yes"><rdf:description rdf:about="</xsl:text> <xsl:value-of select="general/identifier/entry"/> <xsl:text disable-output-escaping="yes">"></xsl:text> 38
XSLT: Ejemplo (continuación) <!--For every subject given by the keyword--> <xsl:for-each select="general/keyword/string"> <xsl:if test="@language = 'en'"> <dc:subject rdf:datatype="http://www.w3.org/2001/xmlschema#string"> <xsl:value-of select="."/> </dc:subject> </xsl:if> </xsl:for-each> <!--For every subject given by the purpose--> <!-- <xsl:for-each select="classification/purpose/value"> <dc:subject rdf:datatype="http://www.w3.org/2001/xmlschema#string"> <xsl:value-of select="."/> </dc:subject> </xsl:for-each> --> <!--For the title--> <xsl:for-each select="general/title/string"> <xsl:if test="@language = 'en'"> <dc:title rdf:datatype="http://www.w3.org/2001/xmlschema#string"> <xsl:value-of select="."/> </dc:title> </xsl:if> </xsl:for-each> <xsl:text disable-output-escaping="yes"></rdf:description></xsl:text> </xsl:for-each> </rdf:rdf> </xsl:template> </xsl:stylesheet> 39
Trabajo propio del alumno asociado a la sesión Tutorial de XML (básico, avanzado, ejemplos): http://www.w3schools.com/xml/default.asp Tutorial de XML Schema (tutorial de esquema, tipos simples, tipos complejos, tipos de datos, referencias de esquema): http://www.w3schools.com/schema/default.asp Tutorial de XSLT (básico, avanzado, ejemplos, referencias); http://www.w3schools.com/xsl/default.asp Tutorial de Xpath: http://www.w3schools.com/xpath/default.asp 40
Referencias Extra XML por el W3C, http://www.w3.org/tr/2008/rec-xml- 20081126/ XML Schema por el W3C, http://www.w3.org/xml/schema XSLT por el W3C, http://www.w3.org/tr/xslt XPath por el W3C, http://www.w3.org/tr/xpath/ A. Skonnard, M. Gudgin, Essential XML Quick Reference: A Programmer's Reference to XML, XPath, XSLT, XML Schema, SOAP, and More http://www.theserverside.net/books/addisonwesley/essen tialxml/downloads/essentialxml.zip 41