Presenta: D Ví Dr. Víctor t J. J Sosa S Sosa S vjsosa@tamps.cinvestav.mx Contenido Introducción Objetivos de la W3C ¾ Definición del Lenguaje XML ¾ Estándares abiertos ¾ Reglas para escribir XML ¾ Componentes de XML ¾ Ejemplo ¾ HMTL, XML, DTD y XSL ¾ Comparación p entre HTML,, XML y SGML ¾ Aplicaciones XML Datos Semi-estructurados ¾ Integración de datos ¾ XPATH, XQuery ¾ Introducción ¾ ¾ GML Lenguaje de Marcado Generalizado. • Creado por IBM en 1969. • Empleado para producir libros, informes... SGML Lenguaje de Marcado Generalizado Estándar Estándar. • Procedente de IBM • Primera tecnología g de información estandarizada y estructurada. • En 1986 emergió como estándar ISO. • Es extramadamente potente, muy complejo y requiere una gran cantidad de software para procesarlo. • Extensibilidad, Estructura y Validación. Introducción... HMTL Lenguaje de Marcado de Hipertexto. • En 1989, Tim Berners y Anders Berglund. • Lenguaje basado en etiquetas para marcar documentos técnicos. • Aplicación • simplificada de SGML Primer formato de información estándar de la Web. XML Lenguaje de Marcado Extensible. • Creado por el equipo “SGML para la Web” • En 1988, especificación XML 1.0 Introducción... ¾ HTML, HTML lenguaje l j de d marcado d específico, utilizado presentar información. para HTML ¾ XML, Especificación que sirve para diseñar marcado. lenguajes de XML SGML Objetivos del W3C:  XML debe ser directamente utilizable sobre Internet.  XML debe soportar una amplia variedad de aplicaciones.  XML debe ser compatible con SGML.  Escritura fácil de programas que procesen documentos XML. p  Número de mínimo de características opcionales.  Los documentos XML deben ser fácilmente creables. Definición del Lenguaje XML Es un subconjunto simplificado de SGML (Standard Generalized Markup Language). Un metalenguaje... t l j un lenguaje l j creado d para codificar difi otros lenguajes que definen la estructura y el contenido de documentos. documentos Estándares Abiertos n XML. Extensible Markup Language g g o DOM. Document Object Model p XSL. Extensible Stylesheet Language q XLL. Extensible Linking Language Reglas para escribir XML 9 Se necesita un elemento raíz. En HTML el elemento raíz siempre es HTML HTML. En XML se puede utilizar cualquier nombre válido: 1. Comienzan con una letra,, guión g de subrayado y (_), ( ), o dos puntos (:). uede estar esta segu seguidos dos po por cualquier cua qu e número ú e o de letras, et as, 2. Pueden dígitos, guiones y puntos adicionales. 9 Se requieren etiquetas de cierre cierre. </ Etiqueta > Reglas para escribir XML... 9 Distinción entre mayúsculas y minúsculas. ; <LIBROS><libro> Guía de Aprendizaje XML </libro></LIBROS> 8 <LIBROS><libro libro> Guía de Aprendizaje XML </LIBRO LIBRO></LIBROS> 9 Los valores deben escribirse entre comillas. ; <LIBRO ISBN=“84-415-0845-3”> 8 <LIBRO ISBN=84-415-0845-3> Reglas para escribir XML... 9 Los elementos deben estar adecuadamente anidados. ; <Etiq.1> ... <Etiq.2> ... <Etiq.3> ... <Etiq.3> ... <Etiq.2> ... <Etiq.1> 8 <Etiq.1> ... <Etiq.2> ... <Etiq.3> ... <Etiq.1> ... <Etiq.3> ... <Etiq.2> 9 Declaración de la versión de XML. <?xml version=“1.0” ?> <? Componentes de XML • Elementos. Todo documento XML se compone de uno o más elementos, delimitados por etiquetas de comienzo y final. final Elemento con Contenido Etiqueta q Inicio <Nom.Elem. ¿atributos?> Etiqueta q Final </Nom.Elem.> Elemento vacío Etiqueta Inicio <Nom.Elem. <Nom Elem ¿atributos?/> Contenido Elementos t t texto 1. <p> Mi Primer <destacar importancia=“1”> documento XML </destacar></p> 2. <imagen archivo=“imagen.gif”/> Componentes de XML... • Atributos. Cada elemento puede tener atributos (propiedades) que ofrecen información o cualidades sobre el e e elemento. e e o <imagen archivo=“imagen.gif”/> • Prólogo. Los documentos XML pueden empezar con un prólogo, en el que se define: • Una declaración XML <?xml version=“1.0” encoding=“UTF-8”?> • Una declaración de tipo de documento <!DOCTYPE DOCTYPE documento SYSTEM “ejemplo.dtd” > Componentes de XML... • Comentarios. Utilizados para proporcionar información adicional. <!-- Esto es un comentario --> ª Pueden colocarse en cualquier sitio, excepto dentro de las declaraciones etiquetas y otros comentarios. declaraciones, comentarios • CDATA. Permiten integrar texto en un documento en XML que de otra forma sería interpretado como etiquetas. <![CDATA[ ![CDATA[ Aquí se puede poner lo que quiera ]]> Componentes de XML... • Entidades predefinidas. Son marcas XML que se utilizan para representar algunos caracteres reservados. <p> Comienza con la etiqueta &lt;documento&gt; </p> 1. 2. 3. 4. 5. 5 &amp; &lt; &gt; &apos; &quot; Ejemplo & < > ’ “ Código HTML <TABLE> <TR> <TD>Título</TD> <TD>Autor</TD> <TD>Precio</TD> </TR> XM L ? <TR> TR <TD>AutoSketch</TD> HTML <TD>Ramón Montero</TD> <TD>33</TD> </TR> <TR> <TD>Windows 98</TD> <TD>Jaime Perez</TD> <TD>3.250</TD> </TR> </TABLE> Código XML <?xml version="1.0" standalone="no"?> <! edited with XMLSPY v5 rel. <!-rel 2 U (http://www.xmlspy.com) by Víctor Sosa (Cinvestav) --> <!DOCTYPE LIBROS SYSTEM "Libros.dtd"> <?xml-stylesheet href="Libros2.xsl" type="text/xsl"?> XML <LIBROS> <LIBRO> <TITULO>XML Al descubierto</TITULO> <AUTOR>Michael Morrison</AUTOR> <PRECIO>450.00</PRECIO> </LIBRO> <LIBRO> TITULO Java y XML</TITULO> XML /TITULO <TITULO>Java <AUTOR>Brett McLaughlin</AUTOR> <PRECIO>350.00</PRECIO> </LIBRO> <LIBRO> <TITULO>Sistemas de Bases de Datos</TITULO> <AUTOR>C. J. Date</AUTOR> <PRECIO>220.00</PRECIO> </LIBRO> </LIBROS> DTD (Document Type Definition) Proporciona la gramática para una clase de documentos XML. ¾ Contiene la definición del conjunto de etiquetas que puede contener una clase de d documentos. t ¾ DTD Los documentos XML con un DTD asociado, se reconocen como “XML Válido” Válido”.. ¾ Los documentos XML sin un DTD asociado, se reconocen como “Bien Formados” Formados”.. ¾ DTD (Document Type Definition)... <!ELEMENT LIBROS (LIBRO)+> <!ELEMENT LIBRO (TITULO, AUTOR, PRECIO)> DTD <!ELEMENT TITULO ((#PCDATA)> ) <!ELEMENT AUTOR (#PCDATA)> <!ELEMENT PRECIO (#PCDATA)> XSL (Extensible StyleSheet Language) ¾ Es un lenguaje de hojas de estilo diseñado para utilización en el Web. su ¾ Permite la descripción de la presentación t ió fí i física documento XML. d l del XSL ¾ Posibilita la ejecución de bucles, sentencias del tipo IF THEN operaciones lógicas, IF...THEN, lógicas etc. XSL <?xml version="1.0"?> <xsl:stylesheet version= version="1 1.0 0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <HTML> <BODY bgcolor="dark" background="manitas.gif"> <br/> <br/> <br/> <table align="center" border="4"> <tbody> <t bgcolor="white"> <tr b l " hit "> <th>Titulo</th> <th>Autor</th> <th>Precio</th> </tr> <xsl:for-each lf h select="/LIBROS/LIBRO"> l "/ IBROS/ IBRO" <tr bgcolor="yellow"> <td><xsl:value-of select="TITULO"/></td> <td><xsl:value-of select="AUTOR"/></td> <td><xsl:value-of select="PRECIO"/></td> </tr> </xsl:for-each> </tbody> </table> </BODY> </HTML> </xsl:template> </xsl:stylesheet> Resultado! XML Spy Versión Raíz Elementos Esquema Hoja de estilo Tabla comparativa. HTML XML SGML Grámática Fija y no ampliable Extensible Extensible Estructura Monolítica Jerárquica Jerárquica No. de marcas Fijas Sin Límite Sin Límite Complejidad Baja Mediana Alta Validación Sin validación Pueden validarse Obligatorio DTD Búsquedas Simples, resueltas por Scripts o CGIs Búsqueda potente y personalizable Búsqueda potente Aplicaciones • CML (C Chemical Markup Language). Describe, fórmulas, estructuras moleculares, análisis de espectros y otros objetos de interés para los químicos. químicos • MathML (M Mathematical Markup Language). Apto para codificar signos matemáticos, matemáticos símbolos científicos, científicos etc. etc • TEI (T Text Encoding Initiative). Trata de establecer etiquetas que propicien la descripción de textos científicos y literarios. • OSD ((O Op pen Software Description p Format). ) Las etiquetas q definen los componentes de software, la versión que es, la plataforma en la que ha sido creado, etc. Contexto ¾ Integración de información: hacer que di i distintas b bases d datos de d trabajen b j como una sola. l ¾ Datos semiestructutados: un nuevo modelo de datos diseñado para afrontar problemas de integración de información. ¾ XML: un lenguaje g j estándar p para describir esquemas de datos semiestructurados y representación de datos. El Problema de Integración de Información ¾ ¾ Datos que se relacionan existen en diferentes l lugares y podrían, d í en principio, i i i trabajar t b j juntos. j t Pero distintas bases de datos difieren en: Modelo ((relacional,, objetos, j , ...)) Esquema (normalizado/sin normalizar..) Terminología (son los consultores empleados? jubilados? subcontratistas? ) 4. Convenciones (metros vs pies) 1. 2. 3. Ej Ejemplo l Una base de datos para una cadena de Bares. Cada bar tiene una base de datos: ¾ Uno podría utilizar un SABD relacional; el otro mantiene el menú en un documento en MS Word. ¾ Uno almacena los teléfonos de los distribuidores; el otro no. ¾ Uno distingue las cervezas sin alcohol de las demás; el otro no. ¾ Uno realiza su inventario contando botes; el otro c enta cajas. cuenta cajas Dos Mecanismos de Integración 1. Almacen de Datos (DW): realiza copias de las fuentes de datos a un sitio central y los transforma en un esquema común. ¾ Reconstruye los datos diarios/semanales, pero no trata de mantenerlos más actualizados que eso. 2. Mediación: crea una vista de todas las fuentes, como si éstas estuvieran integradas. integradas ¾ Responde a una consulta mediante traducirla a los diferentes idiomas de cada fuente de datos y las consulta por separado. E Esquema de d Almacen Al de d Datos D Consulta del Usuario Resultado Almacen (DW) ETL Wrapper Wrapper Fuente 1 Fuente 2 E Esquema de d Mediador M di d Consulta del Usuario Resultado Esquema Mediado “Base de Datos Virtual” Consulta Resultado Consulta Wrapper Consulta Resultado Fuente 1 Resultado Wrapper Consulta Resultado Fuente 2 D Datos S Semiestructurados i d ¾ Propósito: representar los datos de fuentes independientes p de una manera más flexible q que en los modelos relacional u orientado a objetos. ¾ Pensar en objetos, pero que cada tipo de objeto se ajuste a su propio negocio, no en “clases” clases . ¾ Etiquetas que as pa paraa indicar d ca eel ssignificado g cado de subestructuras. Grafos de Datos Semiestructurados ¾ Nodos = Objetos ¾ Etiquetas sobre los arcos (atributos, (atributos relaciones) ¾ Valores atómicos en nodos hoja j ((nodos sin arcos salientes) ¾ Flexibilidad: Sin restricciones en: ¾ Etiquetas fuera de un nodo ¾ Número de sucesores con una etiqueta dada. Ej Ejemplo: l Grafo G f de d Datos D raíz Nótese una clase diferente de datos bar cerveza cerveza manuf manuf galardon Moctezuma b nombre ServidaEn nombre XX Sol nombre callejón di dirección ió plazuela El objeto Bar para callejón de los milagros El objeto bj cerveza para Sol año 2007 premio LaMejor XML R XML: Revisión i ió ¾ XML: eXtensible Markup Language ¾ Mientras que HTML utiliza etiquetas para dar formato (e.g. “italic”), XML utiliza etiquetas para d semántica dar á ti (e.g. ( “ t es una dirección”). “esto di ió ”) ¾ Idea clave: crear un conjunto de etiquetas para un dominio (ej. (ej “bares”) bares ), y traducir todos los datos dentro de documentos XML propiamente etiquetados. Documentos XML bien formados y válidos ¾ En un documento XML bien formado se nos permite i inventar nuestras propias i etiquetas i verificar que todas las etiquetas estén bien anidadas. ¾ Un documento XML válido es aquel que respeta una Definición de Tipo de Documento (DTD: Document Type Definition) en el cual se definen las etiquetas correctas y se da una gramática para su uso. XML Bi Bien F Formados d El documento inicia con una declaración (d l ti ) delimitada (declaration) d li it d por <? ...... ? > ¾ La declaración típica es: ¾ <? XML VERSION = “1.0” STANDALONE = “yes”?> ¾ ¾ STANDALONE = “No se provee un DTD” El contenido del documento es una etiqueta raíz (root) que abarca un conjunto de etiquetas anidadas Ei Etiquetas ¾ ¾ ¾ Las etiquetas, como en HTML, están asociadas normalmente en pares, como <nom_etiqueta> ......</nom_etiqueta> Las etiquetas q ppueden estar anidadas de manera arbitraria También son ppermitidas las etiquetas q qque no requieren finalizar como sucede en <P> en HTML. Ej Ejemplo: l XML Bien Bi Formado F d <? XML VERSION = “1.0” STANDALONE = “yes”?> <BARES> <BAR> <NOMBRE> eclipse</NOMBRE> <CERVEZA> <NOMBRE> Sol </NOMBRE> <PRECIO>20 <PRECIO> </CERVEZA> <CERVEZA> <NOMBRE>XX</NOMBRE> <PRECIO> 25</PRECIO> <CERVEZA> </BAR> </BARES> XML y Datos Semiestructurados ¾ Un documento XML bien formado con sus etiquetas anidadas nos da la misma idea de árboles de datos semiestructurados ¾ Debemos notar que XML también permite estructuras que no son de tipo árbol, al igual que el modelo de datos semiestructurado Ej Ejemplo l Documento XML para BARES bares bar bar bar .. . nombre callejon nombre cerveza cerveza precio nombre Indio Sol precio 30 25 Definiciones de Tipo de Documento (DTD) El DTD es esencialmente una gramática libre de contexto para describir etiquetas XML y sus anidamientos. Cada dominio de interés (por ejemplo componentes electrónicos, bares-cervezasbebedores) crea un documento DTD que describe todos los documentos que este grupo compartirá. E Estructura DTD <!DOC !DOC TYPE <etiqueta < ti t root> t> [ <! ELEMENT <nombre> ( <componentes>) <más componentes> ]> El Elementos DTD ¾La descripción de un elemento consiste d su nombre de b (etiqueta) ( i ) y una descripción d i ió entre paréntesis de cualquier etiqueta anidada. anidada Incluye el orden de las subetiquetas y su multiplicidad ¾ Las hojas (elementos de texto) contienen #PCDATA en lugar de etiquetas anidadas ¾ Ej Ejemplo l de d DTD Un objeto bares tiene 0 o más objetos bar anidados Un bar tiene un <!DOC !DOC TYPE bares b [ nombre y uno o más objetos <! ELEMENT bares ( bar*) > cerveza <! ELEMENT bar ( nombre nombre, cerveza+) > <! ELEMENT nombre ( #PCDATA) > <! ELEMENT cerveza ( nombre,, precio) p )> <! ELEMENT precio ( #PCDATA) > Una cerveza ]> Nombre y precio son textos tiene un nombre y un precio D Descripción i ió de d los l Elementos El ¾ Las subetiquetas deben aparecer en el orden mostrado d ¾ Una etiqueta puede venir seguida por un símbolo que indica su multiplicidad * = cero o más + = uno o más ? = cero o uno ¾ El símbolo | puede conectar una secuencia alternativa de etiquetas. D Descripción i ió de d un Elemento El Ejemplo: Un nombre consta de: un título opcional (e.g. “Prof.”, “Dr.”), un nombre de pila y un apellido, llid en ese orden, d o pudiera di ser una dirección IP: <! ELEMENT nombre ( (título?, nombre_pila, apellido) | dir_IP )> U dde DTD Uso DTDs 1.- Inicializar STANDALONE = “no” 2.- Esto hará: ¾ Incluir el DTD como un preámbulo p del documento XML, o ¾ Seguir la palabra DOCTYPE y la etiqueta <root> con SYSTEM y un camino indicando en dónde se debe encontrar el archivo DTD. DTD Ej Ejemplo l (a) ( ) <? XML VERSION = “1.0” STANDALONE = “no”?> <!DOCTYPE bares [ <! ELEMENT bares ( bar*) > <!! ELEMENT bar b ( nombre, b cerveza+)) > <! ELEMENT nombre ( #PCDATA) > <! ELEMENT cerveza ( nombre, precio) > <!! ELEMENT N pprecio ec o ( ##PCDATA) C )> ]> El DTD El Documento <bares> <bar>< nombre > eclipse</nombre> <cerveza><nombre>Sol</nombre>< precio> 20 </precio> </cerveza> <cerveza><nombre>XX</nombre>< precio> 30 </precio> </cerveza> </bar> <bar> . . . . .. . </bares> Ej Ejemplo l (b) Asumimos que el archivo DTD es bar.dtd <? XML VERSION = “1 “1.0” 0” STANDALONE = ““no”?> ”?> <!DOCTYPE bares SYSTEM “bar.dtd”> <bares> Obtiene el DTD del archivo bar.dtd <bar>< nombre > eclipse</nombre> <cerveza><nombre>Sol</nombre> < precio precio> 20 </precio> /precio </cerveza> /cerveza <cerveza><nombre>XX</nombre> < precio> 30 </precio> </cerveza> /bar </bar> <bar> . . . . .. . </bares> A ib Atributos Las etiquetas de apertura en XML pueden tener atributos, al igual que en HTML: <A HREF = “.....”> ¾ ¾ En un DTD , <!ATTLIST <nombre elemento> <nombre_atributo> [tipo] <valor> > proporciona una lista de atributos con sus tipos de datos para un elemento determinado. Algunos tipos para atributo son: CDATA, ID IDREF, IDREFS. ¾ Los atributos deben tener una declaración predeterminada. Puede consistir en un valor predeterminado para el atributo o #REQUIRED (se debe especificar un valor para el atributo del elemento), #IMPLIED (no se ha proporcionado ningún valor predeterminado y se puede omitir este atributo). Si un atributo tiene valor predeterminado, a los documentos que no traen valor en ese atributo se rellena con el predeterminado. Ej Ejemplo l de d Atributos A ib Los bares pueden tener un atributo tipo, el cual puede ser “botanero”, “deportes”, “otro”. <! ELEMENT bbar ( nombre, b cerveza+) +) > <!ATTLIST bar tipo =“botanero” | “deportes” | “otros” otros > U dde atributos Uso ib Ejemplo: j l En un documento que utiliza etiquetas <bar> nos podríamos dí encontrar: <bar tipo = “botanero”> <nombre> El rincón de los milagros </nombre> <cerveza> <nombre> Corona </nombre> <precio> 25 </precio> </cerveza> .... </bar> ID y IDREF IDs IDREFs Son apuntadores de un objeto a otro, una analogía con HTML sería: NAME = “Titulo” HREF “#Titulo” Permiten a la estructura de un documento XML ser como un grafo genérico más que sólo un árbol. Un atributo de tipo ID puede ser utilizado para dar al objeto (el string que está entre las etiquetas de apertura y cierre) un identificador único. No debe aparecer en ningún otro elemento l d l mismo del i d documento. Un atributo de tipo IDREF refiere a algún objeto mediante su identificador. ¾ El atributo IDREF debe contener un valor que aparezca en el atributo ID de algún elemento en el documento. ¾ IDREFS permite referenciar a múltiples objetos dentro de una etiqueta ID y IDREF IDs IDREFs Ejemplo: Rediseñamos nuestro DTD para BARES. BARES Ahora en este nuevo DTD, BAR y CERVEZA contarán con atributos del tipo ID al cual llamaremos nombre. Los objetos BAR cuentan t con un subobjeto b bj t PRECIO ell cuall es un número ú ( l (el precio de la cerveza) y un IDREF, que llamaremos lacerveza, el cual nos conduce a esa cerveza. Los objetos CERVEZA tendrán un atributo llamado VendidaPor, el cual es un IDREFS, que nos conducirá a todos los bares que la venden. ID y IDREF IDs IDREFs Ejemplo: El DTD. Los objetos bar tienen un atributo ID llamado nombre y contienen uno o más subobjetos precio <!DOCTYPE BARES [ <! ELEMENT BARES (BAR*, CERVEZA*) > Los objetos precio tienen un <! ELEMENT BAR(PRECIO+) > número (el precio) y una <!ATTLIST BAR nombre = ID> referencia a una cerveza. <! ELEMENT PRECIO ( #PCDATA) > <!ATTLIST PRECIO lacerveza = IDREF> <!! ELEMENT CERVEZA ( ) > <!ATTLIST CERVEZA nombre = ID, VendidaPor = IDREFS > ]> Los objetos cerveza tienen un atributo del tipo ID llamado nombre, y un atributo VendidaPor que es un conjunto de nombres de bar D Documento dde ejemplo j l <bares> p <bar nombre = “eclipse”> < precio lacerveza = “Sol”>20 </precio> < precio lacerveza = “Indio”>30</precio> </bar> /b .... <cerveza nombre = “Sol”, VendidaPor = “eclipse, ambar, ....” > </cerveza> . . . . </bares> XML S Schema h XML Schema surge debido a ciertas limitaciones en los DTD: Los DTD están escritos en una sintaxis diferente al XML, no tienen soporte para los espacios de nombres (namespaces), sólo ól ofrecen f tipo i de d datos d li i d limitados, Es difícil usar DTDs para especificar conjuntos desordenados de subelementos. XML V XML: Validación lid ió dde D Documentos t XML Schemas La estructura de los documentos son descritos en términos de restricciones p de restricciones: Existen dos tipos Restricciones de Contenido: Describe el orden y la secuencia de elementos (un pozo tiene un nombre,, una ppresión,, etc.)) y Restricciones de Tipo de Datos: Describen unidades válidas de datos (la señal de una presión debe tener el formato XXXXXX.XXXXX.XXX). XML V XML: Validación lid ió dde D Documentos t XML Schemas XML esquema resuelve estas limitaciones. limitaciones Mejor capacidad de expresar restricciones Menos trabajo de validación Intercambio de datos más rob sto robusto Ventajas de XML Schemas Incremento en tipos de datos (double, date, etc). Tipos Ti d datos de d d fi id por ell usuario definidos i Restricción de tipos especializados, e.g. restringiendo valores máximos y mínimos. mínimos Agrupación de atributos Tipos de datos refinables, refinables o "herencia" herencia . Soporte para espacios de nombre (namespaces). Al Algunos tipos i en XML S Schema h String Integer Decimal Boolean Definidos por el usuario (a partir de tipos simples o complejos) ComplexType Sequence Ej Ejemplos l …[Silberschatz et al.] (DTD => XML Schema) <!DOCTYPE banco [ <!! ELEMENT banco b ((cuenta|cliente|impositor)+) (( | li |i i )+) > <! ELEMENT cuenta (numero_cuenta nombre_sucursal saldo) > <! ELEMENT cliente (nombre_cliente calle_cliente ciudad_cliente) > <! ELEMENT impositor (nombre_cliente (nombre cliente numero_cuenta) numero cuenta) > <! ELEMENT numero_cuenta (#PCDATA) > <! ELEMENT nombre_sucursal (#PCDATA) > <!! ELEMENT saldo (#PCDATA) > <! ELEMENT nombre_cliente (#PCDATA) > <! ELEMENT calle_cliente (#PCDATA) > <! ELEMENT ciudad_cliente ((#PCDATA)) > ]> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> yp p <xs:element name=“banco“ type=“TipoBanco”/> <xs:element name=“cuenta“ > <xs:complexType> <xs:sequence> <xs:element name=“numero_cuenta" type="xs:string"/> <xs:element name=“nombre_sucursal" type="xs:string"/> <xs:element l name=“saldo" “ ld " type="xs:decimal"/> " d i l"/ </xs:sequence> </xs:complexType> </xs:element> <xs:element name=“cliente“ > <xs:element name name=“nombre nombre_cliente cliente" type type="xs:string"/> xs:string /> <xs:element name=“calle_cliente" type="xs:string"/> <xs:element name=“ciudad_cliente" type="xs:string"/> </xs:element> <xs:element name=“impositor“ > <xs:complexType> p yp <xs:sequence> <xs:element name=“nombre_cliente" type="xs:string"/> <xs:element name=“numero_cuenta" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> / l t <xs:complexType name=“TipoBanco”> <xs:sequence> <xs:element ref=“cuenta” minOccurs=“0" maxOccurs=“unbounded"/> <xs:element ref=“cliente” minOccurs=“0" maxOccurs=“unbounded"/> <xs:element ref ref=“impositor” impositor minOccurs minOccurs=“0" 0 maxOccurs maxOccurs=“unbounded"/> unbounded /> </xs:sequence> </xs:complexType> </xs:schema> Versión XML Schema del DTD anterior. XML Schema: Atributos, Atributos Claves y Claves externas Definición de atributos: ¾ Se pueden añadir atributos en los elementos. Por ejemplo podemos agregar el atributo numero_cuenta al elemento cuenta: <xs:attribute name = “numero_cuenta”/> Definición de claves Podemos especificar que numero_cuenta es clave de cuenta. Esto se hace en el elemento raíz banco: <xs:key name = “claveCuenta”> <xs:selector xpath = “/banco/cuenta”/> Í ámbito de la restricción <xs:field xpath = “numero_cuenta”/> Í atributo(s) que forman la clave /xs:key </xs:key> Definición de claves externas Podemos especificar una restricción de clave externa desde impositor hasta cuenta: <xs:keyref name = “claveExtImpositorCuenta” refer = “claveCuenta”> <xs:selector l t xpath h = “/b “/banco/impositor”/> /i i ”/ <xs:field xpath = “numero_cuenta”/> </xs:key> XML Schema: Consulta y Transformación XPath: lenguaje de expresiones de rutas de acceso. Fundamento de los lenguajes de consultas. XQuery: Lenguaje de consultas de datos XML. Modelado a ppartir de SQL, Q ppero diferente, y ya q que tiene q que manejar j datos XML anidados. Incorpora expresiones XPath XSLT: Lenguaje g j de transformación. Parte del sistema de hojas de estilo XSL. Aunque se utiliza normalmente para controlar el formato de los datos XML, puede expresar también consultas. XP h XPath Trata partes de los documentos XML mediante expresiones de rutas de acceso. Ejemplo: /banco/cliente/nombre_cliente Devolverá de cada elemento cliente los datos de los sub elementos nombre_cliente: <nombre_cliente>Pedro</nombre_cliente> < <nombre_cliente>Juanito</nombre_cliente> b li t >J it </ b li t > <nombre_cliente>María</nombre_cliente> Si se requieren sin las etiquetas que los rodean: /banco/cliente/nombre cliente/text() /banco/cliente/nombre_cliente/text() Acceso a los atributos: /banco/cuenta/@numero_cuenta Devolverá un conjunto con todos los valores de los atributos numero_cuenta de los elementos cuenta. XP h Predicados XPath: P di d dde selección l ió Se escriben entre corchetes Obtener los elementos cuenta con saldo > 400: /banco/cuenta[saldo>400] Obtener sólo los numero_cuenta de los elementos cuenta con saldo > 400: /banco/cuenta[saldo>400]/@numero_cuenta Devolver numero_cuenta de todas las cuentas que tengan subelemento saldo sin importar su valor: /banco/cuenta[saldo]/@numero_cuenta XP h Predicados XPath: P di d dde selección l ió XPath proporciona varias funciones que se pueden usar como parte de predicados. E.g. Devolver las cuentas con más de dos clientes: /b /banco/cuenta/[count(./cliente) / t /[ t( / li t ) > 2] Devolver todos los clientes referenciados (uso de IDREFS) desde el atributo titular de los elementos cuenta: /banco/cuenta/(@titular) Para obtener la raiz de un documento determinado: doc(“banco.xml”) Se puede utilizar dentro de una operación: doc(“banco.xml”)/banco/cuenta XQUERY Lenguaje de consulta normalizado de XML d desarrollado ll d por ell consorcio i W3C Norma que consideramos: Ene/2005 Procede de un lenguaje de consulta XML llamado Quilt XQUERY Los conjuntos de elementos son descritos por sus caminos (paths), compuestos de: URL, si es necesario. Nombre de los elementos formando un camino en el grafo f de d datos d t semiestructurados, i t t d e.g. //BAR/NOMBRE = “inicia en cualquier nodo BAR y trasladate a un hijo NOMBRE”. Condición de terminación de la forma: [ <condición relacionada con subelementos, atributos (precedido por @ ), y valores>]. XQUERY: Expresiones FLWOR 5 secciones de XQuery: For, Let, Where, Order by, Return (FLWOR) Ejemplo: obtener los números de cuentas de las cuentas corrientes (usandando ID y IDREFS): for $x in /banco/cuenta let $numcuenta := $x/@numero_cuenta where $x/saldo > 400 return <numero_cuenta>{$numcuenta}</numero_cuenta> La clausula L l l for f actúa ú similar i il a la l cláusula lá l from f d SQL de Las variables que se obtienen en for contiene valores resultantes de expresiones XPath. Si se especifica más de una variable en el for se actúa como producto cartesiano. La cláusula let permite que se asignen valores resultantes de expresiones XPath a variables para simplificar la representación. representación La cláusula where ejecuta comprobaciones, similares a SQL. La cláusula order by permite la ordenación de la salida. La cláusula rerturn permite la construcción de resultado en XML. XQUERY: Expresiones FLWOR Se puede prescindir de algunas cláusulas sin problema. Ejemplo: for $x in /banco/cuenta[saldo > 400] return <numero_cuenta> {$x/@numero_cuenta} </numero_cuenta> Las { } indican expresiones a evaluar cuya salida se incorporará al texto XML. Esto también se aplica con las llaves entre comillas: return <cuenta numero numero_cuenta cuenta = “{$x/@numero {$x/@numero_cuenta} cuenta}” /> XQUERY: Expresiones FLWOR XQuery proporciona otra forma de construir elementos utilizando constructores element y attribute. Ejemplo. Ej l Devolveremos D l elementos l t cuenta t con los l atributos: t ib t numero_cuenta, nombre_sucursal y saldo como subelemento: return element cuenta { atribute numero_cuenta {$x/@numero_cuenta}, atribute nombre_sucursal {$x/nombre_sucursal}, element saldo {$x/saldo} } Ejemplo: <? XML VERSION = “1.0” STANDALONE = “no”?> <!DOCTYPE bares SYSTEM “bar bar.dtd dtd”> > <bares> <bar tipo = “deportes”> < nombre b > eclipse</nombre> li / b <cerveza><nombre>Sol</nombre> < precio> 20 </precio> </cerveza> <cerveza><nombre>Indio</nombre> < precio> 30 </precio> </cerveza> </bar> <bar tipo = “botanero”> botanero > < nombre > El rincón de los milagros</nombre> <cerveza><nombre>Victoria </nombre> <p precio> 20 </precio> p </cerveza> </bar> . . . . </bares> C Consulta l en XQUERY ¾ Encontrar el precios que se le da a la cerveza Sol en los bares de tipo p deportes p que q sirven Indio FOR $ba IN document(“http://cinvestav.mx/bares.xml”) //BAR[@tipo [@ p = “deportes”], p ] $be IN $ba/CERVEZA[NOMBRE = “Sol”] WHERE $ba/CERVEZA/[NOMBRE = “Indio”] RETURN $be/PRICE; XQUERY R XQUERY: Reuniones i Las reuniones se especifican de manera similar que con SQL. Por ejemplo, la reunión de los elementos impositor, cuenta y cliente: for $a in /banco/cuenta, $c in /banco/cliente, $i in /banco/impositor where $$a/numero_cuenta = $ $i/numero_cuenta and $c/nombre_cliente = $i/nombre_cliente return <cuenta_cliente> {$c $a}</cuenta_cliente> La misma consulta haciendo uso de XPath: for $a in /banco/cuenta, $c in /banco/cliente, $i in /banco/impositor[numero_cuenta=$a/numero_cuenta and nombre_cliente = $c/nombre_cliente] return <cuenta_cliente> {$c $a}</cuenta_cliente> Notas: Ejemplos de algunos operadores: eq, ne, lt, gt, le, ge Si se evalúan secuencias como $x/saldo = $y/saldo sería verdad si alguno de los valores devueltos por la primera expresión es igual a cualquier otro valor de la segunda. XQUERY Consultas XQUERY: C l anidadas id d Las expresiones FLWOR de XQuery se pueden anidar en la cláusula return con el fin de generar anidamientos que no aparecen en el documento origen. Ejemplo: <banco-1> { for $c in /banco/cliente return <cliente> {$c/*} {for $i in /banco/impositor[nombre_cliente /banco/impositor[nombre cliente = $c/nombre_cliente], $c/nombre cliente] $a in /banco/cuenta[numero_cuenta = $i/numero_cuenta] return $a} </cliente> }</banco-1> NOTA: consulta para generar el documento de la siguiente figura [fig 10.4 Silberschatz] a partir del documento de [fig 10.1 Silberzschatz]. R Representación ió XML anidada id d <banco-1> <cliente> <nombre_cliente> Gonzalez </nombre_cliente> <calle_cliente> Arenal </calle_cliente> <ciudad_cliente> La Granja </ciudad_cliente> <cuenta> <numero_cuenta> C-101 </numero_cuenta> <nombre_sucursal> Centro </nombre_sucursal> <saldo> 500 </saldo> </cuenta> <cuenta> <numero_cuenta> C-201 </numero_cuenta> <nombre_sucursal> Galagapar </nombre_sucursal> <saldo> 900 </saldo> </cuenta> </cliente> <cliente> <nombre cliente> Lopez </nombre_cliente> <nombre_cliente> </nombre cliente> <calle_cliente> Mayor </calle_cliente> <ciudad_cliente> Peguerinos </ciudad_cliente> <cuenta> <numero_cuenta> C-102 </numero_cuenta> <nombre_sucursal> Navacerrada </nombre_sucursal> <saldo> 400 </saldo> </cuenta> </cliente> </banco-1> documento de [fig 10 4 <banco> <cuenta> <numero_cuenta> C-101 </numero_cuenta> <nombre_sucursal> Centro </nombre_sucursal> <saldo> 500 </saldo> <cliente> </cuenta> <nombre_cliente> Lopez </nombre_cliente> <cuenta> <calle_cliente> Mayor </calle_cliente> <numero_cuenta> C-102 </numero_cuenta> <ciudad_cliente> Peguerinos </ciudad_cliente> <nombre_sucursal> Navacerrada </nombre_sucursal> </cliente> <saldo> 400 </saldo> <impositor> </cuenta> <numero numero_cuenta cuenta> C C-101 101 </numero /numero_cuenta cuenta> <cuenta> <nombre_cliente> Gonzalez </nombre_cliente> <numero_cuenta> C-201 </numero_cuenta> </impositor> <nombre_sucursal> Galapagar </nombre_sucursal> <impositor> <saldo> 900 </saldo> <numero_cuenta> C-201 </numero_cuenta> </cuenta> /cuenta < <nombre_cliente> b li t > Gonzalez G l </nombre_cliente> </ b li t > <cliente> </impositor> <nombre_cliente> Gonzalez </nombre_cliente> <impositor> <calle_cliente> Arenal </calle_cliente> <numero_cuenta> C-102 </numero_cuenta> <ciudad_cliente> La Granja </ciudad_cliente> <nombre_cliente> _ Lopez p </nombre_cliente> _ </ li t > </cliente> </impositor> </banco> documento de [fig 10.1 Silberzschatz]. F i Funciones: SUM , COUNT Xquery soporta varias funciones que son comunes a XPath2.0 y se pueden usar en cualquier expresión de ruta de XPath. Para evitar conflictos las funciones se asocian con un espacio de nombres: h // http://www.w3.org/2004/10/xpath-functions / / / hf i Tienen el prefijo predeterminado fn que se asocia con el espacio de nombres. Así se reconocen sin ambigüedades: fn:sum fn:count ffor $$c iin /banco/cliente /b / li t return <saldo-total-cliente> <nombre_cliente> {$c/nombre_cliente} </nombre_cliente> < ld t t l> {fn:sum( <saldo_total> {f ( for $i in /banco/impositor[nombre_cliente = $c/nombre_cliente], $a in /banco/cuenta/[numero_cuenta = $i/numero_cuenta] return $a/saldo ) } </saldo_total> </ ld t t l> <saldo-total-cliente> Od Ordenación ió de d resultados l d En XQuery los resultados se pueden ordenar si se introduce una cláusula order by. Ejemplo: De manera descendente: for $c in /banco/cliente,, order by $c/nombre_cliente $c/nombre cliente descending order by $c/nombre_cliente return <cliente> {$c/* } </cliente> La ordenación se puede realizar en varios niveles de anidamiento. <banco-1>{ Ejemplo: for $c in /banco/cliente, order by $c/nombre_cliente return <cliente> {$c/* } { for $c in /banco/impositor/[nombre_cliente = $c/nombre_cliente], $a in /banco/cuenta/[numero_cuenta = $i/numero_cuenta] order by $a/numero_cuenta return <cuenta> {$a/* } </cuenta> } </cliente> } </banco-1> D fi i ió de Definición d funciones f i A pesar de que XQuery cuenta con una serie de funciones predefinidas, como funciones numéricas, de comparación y de manipulación, XQuery soporta funciones definidas por el usuario. Secuencia de valores define function saldos(xs:string $c) as xs:decimal* { for $i in /banco/impositor/[nombre_cliente = $c], $a in /banco/cuenta/[numero_cuenta = $i/numero_cuenta] return $a/saldo } Los tipos L ti se pueden d especificar ifi parcialmente; i l t por ejemplo j l ell tipo ti element l permite it elementos con cualquier etiqueta, mientras que element(cuenta) permite sólo con la etiqueta cuenta. XQuery realiza conversión de tipos automáticamente. Aunque también proporciona funciones para convertir convertir, ejemplo: number(x) Cuando se pasa un elemento a una función que espera una cadena, la conversión a cadena se hace concatenando todos los valores de texto contenidos (anidados) dentro del elemento. Función para manejar cadenas: contains(a,b) O Otras características í i XQuery ofrece una gran variedad de características adicionales tales como constructores if-then-else que pueden ser utilizados en cláusulas return. return También se pueden utilizar la cuantificación existencial y universal, que se pueden usar en predicados en cláusulas where: some $e in ruta satisfies P ruta: expresión de ruta (path), P: Predicado utilizando $e, Cuantificador: some o every. La norma XQJ Q pproporciona p una interfaz de p programación g de aplicaciones (API) para ejecutar consultas XQuery en un sistema de bases de datos XML y para devolver los resultados XML. Su funcionalidad es similar a la API JDBC. XSLT en las l Bases B de d Datos D XML cuenta con un lenguaje de estilos llamado XSL (XML Stylesheet Language). Este lenguaje de estilos estaba originalmente diseñado para generar HTML a partir de XML. El lenguaje incluye un mecanismo de transformación de propósito general, denominado XSLT (XSL Transformations) XSLT se puede utilizar para transformar un documento XML a otro documento XML, o a otros formatos como HTML. La transformaciones XSLT se expresan como una serie de reglas recursivas, llamadas plantillas. <xsl:template match=“/banco-2/cliente”> <xsl:value-of select=“nombre_cliente”/> </xsl:template> <xsl:template match=“*”/> Pl ill XSLT Plantillas En su forma básica las plantillas permiten la selección de nodos en un árbol XML mediante una expresión XPath. Una plantilla sencilla de XSLT consiste en una parte de coincidencia (match) y una parte de selección (select). Ejemplo: <xsl:template match=“/banco-2/cliente”> <xsl:value of select=“nombre <xsl:value-of select= nombre_cliente cliente”/> /> </xsl:template> Resultado <xsl:template match=“*”/> sin etiquetar. Devuelve valores de la etiqueta indicada Seleccionar todos <xsl:template match=“/banco-2/cliente”> <cliente> <xsl:value-of select=“nombre_cliente”/> <cliente> Resultado </xsl:template> con etiquetas. <xsl:template match=“*”/> match= * /> Devuelve valores de la etiqueta indicada XSLT Recursividad XSLT: R i id d La idea de la recursividad estructural en XSLT es la siguiente: cuando una plantilla coincide con un elemento en la estructura de árbol, XSLT puede usar la recursividad para aplicar las reglas de la plantilla recursivamente a los subárboles en lugar de simplemente devolver un valor. Aplica las reglas de la plantilla recursivamente mediante la directiva: xsl:apply-templates <xsl:template match=“/banco”> Construye un documento resultado mediante la aplicación de otras plantillas a los subárboles que aparecen en el elemento banco, banco pero envolviendo los resultados en el elemento <clientes> </clientes> . <clientes> <xsl:apply-templates/> </clientes> </xsl:template> <xsl:template match=“/cliente”> <cliente> <xsl:value-of select=“nombre_cliente”/> <cliente> </xsl:template> <xsl:template match=“*”/> XSLT Keys XSLT: K XSLT proporciona una característica denominada keys (claves) que permite la búsqueda de elementos mediante el uso de valores de subelementos o atributos. Los objetivos son similares a los de la función id() de XPath, pero las claves de XSLT permiten usar atributos distintos a los atributos ID. Se definen mediante la directiva: xsl:key <xsl:key name=“numcuenta” match=“cuenta” use=“numero_cuenta”/> name: utilizado para distinguir entre claves distintas. match: especifica los nodos a los que se le aplica la clave. use: especifica la expresión a usar como el valor de la clave. * Para buscar el conjunto de nodos que coinciden con que su clave es numcuenta y su valor es C-401 se puede emitir la siguiente expresión: key(“numcuenta”,”C-401”). La clave numcuenta especifica que el subelemento b l t numero_cuenta de cuenta se debería de usar como una clave para esa ccuenta. enta XSLT: Reuniones utilizando Key Las claves se pueden utilizar para implementar algunos tipos de reuniones: <xsl:key name=“numcuenta” match=“cuenta” use=“numero_cuenta”/> <xsl:key name=“numcliente” match=“cliente” use=“nombre_cliente”/> <xsl:template match=“impositor”> <cuenta_cliente> <xsl:value-of select =key(“numcliente”,”nombre_cliente”)/> <xsl:value-of select =key(“numcuenta”,”numero_cuenta”)/> </cuenta_cliente> </xsl:template> <xsl:template match=“*”/> La función key reúne los elementos impositor con los elementos coincidentes cliente y cuenta. El resultado de la consulta consiste en pares de elementos cliente y cuenta encerrados entre elementos cuenta_cliente. cuenta cliente. ** Nótese que nombre_cliente y numero_cuenta son los valores de las etiquetas que se extraen de impositor, ver el archivo XML en la siguiente página. Ejemplo de Información bancaria en XML <banco> <cuenta> <numero_cuenta> C-101 </numero_cuenta> <nombre_sucursal> Centro </nombre_sucursal> <cliente> <saldo> 500 </saldo> <nombre_cliente> Lopez p </nombre_cliente> </cuenta> / <calle_cliente> Mayor </calle_cliente> <cuenta> <ciudad_cliente> Peguerinos </ciudad_cliente> <numero_cuenta> C-102 </numero_cuenta> </cliente> <nombre_sucursal> Navacerrada </nombre_sucursal> <impositor> <saldo> 400 </saldo> <numero cuenta> C <numero_cuenta> C-101 101 </numero </numero_cuenta> cuenta> </cuenta> <nombre_cliente> Gonzalez </nombre_cliente> <cuenta> </impositor> <numero_cuenta> C-201 </numero_cuenta> <impositor> <nombre_sucursal> Galapagar </nombre_sucursal> <numero_cuenta> C-201 </numero_cuenta> <saldo> 900 </saldo> <nombre_cliente> Gonzalez </nombre_cliente> </cuenta> </impositor> <cliente> <impositor> <nombre_cliente> Gonzalez </nombre_cliente> <numero_cuenta> C-102 </numero_cuenta> <calle_cliente> Arenal </calle_cliente> <nombre cliente> Lopez </nombre <nombre_cliente> </nombre_cliente> cliente> <ciudad_cliente> La Granja </ciudad_cliente> </impositor> </cliente> </banco> XSLT Ordenamiento XSLT: Od i XSLT permite ordenar los nodos utilizando xsl:sort j p , si qquisiéramos ordenar los elementos cliente Por ejemplo, xsl:apply-templates sólo se por su nombre: <xsl:template match=“/banco”> <xsl:apply-templates select=“cliente”> <xsl:sort select=“nombre_cliente”/> </xsl:apply-templates> </xsl:template> <xsl:template match=“cliente”> <cliente> <xsl:value-of select=“nombre_cliente”/> <xsl:value-of select=“calle_cliente”/> <xsl:value-of select=“ciudad_cliente”/> <cliente> </xsl:template> <xsl:template match=“*”/> aplica a los subelementos cliente La directiva xsl:sort en el elemento xsl:apply-template hace que los nodos se ordenen antes de ser procesados por el siguiente conjunto de plantillas. L norma SQL/XML La Define una extensión normalizada de SQL, que permite la creación de respuestas XML anidadas. La norma contiene varias partes, incluyendo una manera estándar de identificar los tipos SQL con los tipos de XML Schema, y una manera estándar de identificar esquemas relacionales con esquemas XML, así como extensiones del lenguaje de consultas SQL. SQL/XML añade varios operadores y operaciones de SQL para permitir la construcción de la salida XML directamente a partir de SQL extendido, ejemplos: xmlelement (crear elementos) xmlattributes (crear atributos): select xmlelement (name “cuenta”, xmlattribute (numero_cuenta as numero_cuenta), xmlelement (name “nombre_sucursal”, nombre_sucursal), xmlelement (name ( “saldo”, ld saldo)) ld )) from cuenta SQL/XML xmlforest: su sintaxis y comportamiento son similares a los de xmlattributes, excepto que crea una colección (bosque) de subelementos, en vez de una lista de atributos. Toma varios argumentos, creando un elemento l t para cada d argumento t con ell nombre b SQL del d l atributo t ib t usado d como nombre del elemento XML. xmlconcat: se puede utilizar para concatenar los elementos creados por subexpresiones en un bosque. bosque Cuando el valor SQL usado para construir un atributo es nulo, se omite. xmlagg: función de agregación que crea una colección (bosque) de elementos XML a partir de la colección de los valores a los que se aplica. Crea un elemento para cada sucursal, select xmlelement (name “sucursal”, conteniendo como subelementos todos nombre_sucursal los números de cuenta en esa sucursal. xmlagg (xmlforest(numero_cuenta) (xmlforest(numero cuenta) order by numero_cuenta)) Puesto que el query tiene una cláusula group by from cuenta nombre_sucursal, la función de agregación se group by nombre_sucursal aplica a todas las cuentas de cada sucursal. Má Información… Más I f ió Información adicional acerca del uso de XML/SQL: http://www.stylusstudio.com/sqlxml_tutorial.html Información I f ió del d l uso de d XML con MySQL M SQL 5.1: 51 http://dev.mysql.com/tech-resources/articles/mysql-5.1-xml.html Especificación de XPath: http://www.w3.org/TR/xpath Especificación de XQuery: http://www.w3.org/TR/xquery/ p g q y Implementaciones de Xquery: http://www.w3.org/XML/Query/#implementations Lectura complementaria: Capitulo 11 y 12 del libro: Database Systems, The Complete Book, Hector García-Molina et al. 2nd. Edition. 2009.