Anda di halaman 1dari 28

XPATH XPath es un lenguaje que permite seleccionar nodos de un documento XML y calcular valores a partirde su contenido.

Existen dos versiones de XPath aprobadas por el W3C, XML Path Language 1.0 (noviembre de 1999) y XML Path Language 2.0 (enero de 2007). La ms utilizada actualmente es la versin 1. XPath considera un documento XML como un rbol de nodos. En Informtica, un rbol es una estructura de datos que equivale a un rbol matemtico. En Matemticas un rbol es un caso particular de grafo. Los siguientes trminos definidos en teora de grafos se utilizan tambin en Informtica y en XPath: Un grafo es un conjunto de objetos llamados nodos o vrtices unidos por enlaces llamados arcos o aristas. Un grafo dirigido es un grafo en el que los arcos tienen direccin. Cuando dos nodos estn unidos por un arco con direccin, el nodo padre es el nodo del que parte el arco y el nodo hijo es el nodo al que llega el arco. Un rbol es un grafo en el que cualquier pareja de vrtices estn conectada por un nico camino (es decir, que no hay ciclos). Un rbol dirigido es un rbol en el que las aristas tienen direccin y todos los nodos menos uno tienen un nico padre. El nodo raz de un rbol dirigido es el nico nodo sin padre. Los nodos hermanos son los nodos que tienen el mismo padre Los nodos descendientes de un nodo son todos los nodos a los que se llega desde el nodo: los hijos, los hijos delos hijos, etc. Los nodos ascendientes de un nodo son todos los nodos de los que un nodo es descendiente: el padre, el padre del padre, etc. Tipos de nodos Un documento XML puede representarse como un rbol dirigido, considerando por ejemplo los elementos como nodos y que un elemento es padre de los elementos que contiene. Pero en XPath no slo los elementos son nodos, en realidad hay siete tipos de nodos: Raz Elemento Atributo Texto Comentario Instruccin de procesamiento Espacio de nombres

Nota: La declaracin DOCTYPE no se considera como nodo. Por ejemplo, el documento XML siguiente: <?xml version="1.0" encoding="iso-8859-1"?> <biblioteca>

<libro> <titulo>La vida est en otra parte</titulo> <autor>Milan Kundera</autor> <fechaPublicacion ao="1973"/> </libro> <libro> <titulo>Pantalen y las visitadoras</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion ao="1973"/> </libro> <libro> <titulo>Conversacin en la catedral</titulo> <autor fechaNacimiento="28/03/1936">Mario Vargas Llosa</autor> <fechaPublicacion ao="1969"/> </libro> </biblioteca> se puede representar mediante el siguiente grafo:

Los nodos atributos y de texto no son como los nodos elemento. Por ejemplo, los nodos atributo y de texto no pueden tener descendientes. En realidad el nodo atributo ni siquiera se considera como hijo, sino como una etiqueta adosada al elemento. El texto contenido por una etiqueta s que se considera hijo del elemento, aunque las expresiones XPath suelen trabajar con nodos elementos y para referirse a los atributos o al texto se utilizan notaciones especiales.

Sintaxis de la expresiones XPath Una expresin XPath es una cadena de texto que representa un recorrido en el rbol del documento. Las expresiones ms simples se parecen a las rutas de los archivos en el explorador de Windows o en la shell de GNU/Linux. Evaluar una expresin XPath es buscar si hay nodos en el documento que se ajustan al recorrido definido en la expresin. El resultado de la evaluacin son todos los nodos que se ajustan a la expresin. Las expresiones XPath se pueden escribir de dos formas distintas: sintaxis abreviada: ms compacta y fcil de leer sintaxis completa: ms larga pero con ms opciones disponibles Las expresiones XPath se pueden dividir en pasos de bsqueda. Cada paso de bsqueda se puede a su vez dividir en tres partes: - eje: indica el nodo o los nodos en los que se realiza la bsqueda - nodo de comprobacin: especifica el nodo o los nodos seleccionados dentro del eje - predicado: permite restringir los nodos de comprobacin Sintaxis abreviada Veamos unos ejemplos de expresiones XPath de sintaxis abreviada y el resultado de su evaluacin en el documento de ejemplo anterior: Ejes /: si est al principio de la expresin, indica el nodo raz, si no, indica "hijo".

//: indica "descendiente" (hijos, hijos de hijos, etc.).

@atributo: selecciona el atributo.

..: selecciona el elemento padre

|: permite elegir varios recorridos.

Nodos de comprobacin node(): selecciona todos los nodos (elementos y texto).

text(): selecciona el contenido del elemento (texto).

*: selecciona todos los elementos

(No devuelve nada porque autor slo contiene texto @*: selecciona todos los atributos

Predicados Los predicados se escriben entre corchetes [@atributo]: selecciona los elementos que tienen el atributo.

[nmero]: si hay varios resultados selecciona uno de ellos por nmero de orden; last() selecciona el ltimo de ellos

Los predicados permiten definir condiciones sobre los valores de los atributos. En las condiciones se pueden utilizar los operadores siguientes: - operador de unin (OR lgico): | - operadores lgicos: and, or, not() - operadores aritmticos: +, -, *, div, mod - operadores de comparacin: =, !=, <, >, <=, >= [condicion]: selecciona los nodos que cumplen la condicin. La condicin puede utilizar el valor de un atributo (utilizando @) o el texto que contiene el elemento (utilizando .)

Se pueden escribir varios predicados seguidos, teniendo en cuenta que cada uno restringe los resultados del anterior, como si estuvieran encadenados por la operacin lgica and.

Expresiones ms complicadas. Las expresiones XPath pueden anidarse, lo que permite definir expresiones ms complicadas. Por ejemplo, en el documento utilizado anteriormente, un ejemplo de expresin ms complicada sera, por ejemplo, obtener los ttulos de los libros publicados el mismo ao que la novela "La vida est en otra parte". Esta informacin no est directamente almacenada en el documento, pero se puede obtener la respuesta en dos pasos: Obtener primero el ao en que se public la novela "La vida est en otra parte:

Y obtener despus los ttulos de los libros publicados en 1973:

Estas dos expresiones se pueden unir en una nica expresin, sustituyendo en la segunda expresin el valor 1973 por la primera expresin:

UTILIZACIN DE XML PARA EL ALMACENAMIENTO DE INFORMACIN Gran parte de las BD que hay hoy en da estn basadas en un modelo de datos(llamado modelo de entidad-relacin) Es un modelo que ha funcionado bien durante mucho tiempo y que todava seguir funcionando. Si bien es cierto que las BD orientadas a objetos permiten simplificar el trabajo de integracin con los lenguajes de programacin orientados a objetos, cambiar un modelo de trabajo o un sistema que funciona con el modelo anterior es arriesgado. Algunos SGBD tiene modelo hbridos que permiten aadir extensiones al modelo relacional y avanzar a un modelo orientado a objetos de manera transparente. Tras la llegada de la era Internet, la comparticin de la informacin empez a resultar crucial para no quedarse desfasado y mejorar las relaciones comerciales. Por ejemplo, una empresa X necesita enviarle a la empresa Y informacin en relacin a sus transacciones comerciales. El envo de esta informacin beneficia a X y tambin a Y(reduccin de

costes econmicos, costes burocrticos, tiempo, etc.) Es lo que se denomina B2B. El problema es que X utiliza unos modelos de datos distintos a los de Y. Tampoco es fcil ponerse de acuerdo con el SGBD. Debe haber algo que permita que ambos sistemas puedan entenderse entre s siendo distintos. La solucin es XML. XML permite definir de manera rpida e intuitiva una representacin de la informacin que ambas empresa desean compartir. La empresa X usar su SGBD para exportar sus datos a XML y se los remitir a Y. Ambas empresas conocen esa representacin de la informacin por lo que la informacin fluir sin problema (independientemente de los campos que tengan sus respectivas BDs o de los SGBD que estn utilizando) Los SGBD actuales(sobre todo los que usan modelos relacionales), proporcionan en algunos casos extensiones que permitan trabajar con los modelos y representaciones definidas en documentos XML. An as, si el objetivo es utilizar XML desde el principio, se debera analizar las siguientes BD XML nativas: - Excelon XIS Lite - TEXTXML - dbXML - eXist Cuando se habla de BD XML nativas, se ha de dejar claro que existen dos maneras de almacenar informacin dentro de ellas: - Usando un modelo centrado en el almacenamiento de los datos: Exactamente igual que las BD Relacionales (Se guardan tuplas) - Usnado un modelo centrado en el documento: no hay campos, ni datos, tal y como se conoce en las BD Relacionales. Se guardan documentos XML La primera permite seguir utilizando los modelos relacionales dentro de BD XML. La segunda permite almacenar documentacin de diferentes modelos dentro de la BD. Dependiendo de los objetivos de almacenamiento que se planteen quizs se ajuste ms un modelo que otro. Este anlisis debe ser meditado Dado que el modelo relacional es el mas utilizado hoy en da, se indicarn una serie de pasos para que usando XML se pueda usar el mismo modelo de datos

Regla 1 Para cada tabla en el esquema de la base de datos hay que crear un elemento con el mismo nombre de la tabla y la cardinalidad apropiada.

<!DOCTYPE libros [ <!ELEMENT libros (libro)*> ]>


Regla 2 Las columnas de la tabla son incluidas en otro elemento (sub-elemento del elemento creado en la regla anterior), que representa un registro en la tabla

<!ELEMENT libro (isbn, titulo, autores, editor, precio, ao, revisores)>


Regla 3 Para cada columna en la tabla cuyo tipo de dato es simple (char, integer, etc.) crear un elemento, sub-elemento del elemento creado en el paso anterior, de tipo #PCDATA con el mismo nombre de la columna. <!ELEMENT isbn (#PCDATA)> <!ELEMENT titulo (#PCDATA)> Regla 4 Para cada columna en la tabla cuyo tipo de dato es complejo (tipo objeto), crear un elemento complejo, sub-elemento del elemento creado en el paso 2, con el mismo nombre de la columna. Para cada propiedad del tipo objeto crear un elemento con el mismo nombre de la propiedad.

<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT

autores (autor)+> autor (nombre, apellidos, email)> nombre (#PCDATA)> apellidos (#PCDATA)> email (#PCDATA)>

Regla 5 Para cada columna en la tabla que es una tabla anidada, crear un elemento con el mismo nombre de esa columna y la cardinalidad apropiada. Repetir todos los pasos desde el 2. DTD resultante

<!DOCTYPE libros [ <!ELEMENT libros (libro)*> <!ELEMENT libro (isbn, titulo, autores, editor, precio, ao, revisores)> <!ELEMENT isbn (#PCDATA)> <!ELEMENT titulo (#PCDATA)> <!ELEMENT autores (autor)+> <!ELEMENT autor (nombre, apellidos, email)> <!ELEMENT editor (nombre,oficina,homepage) > <!ELEMENT nombre (#PCDATA)> <!ELEMENT apellidos (#PCDATA)> <!ELEMENT email (#PCDATA)> <!ELEMENT oficina (#PCDATA)> <!ELEMENT homepage (#PCDATA)> <!ELEMENT precio (#PCDATA)> <!ELEMENT ao (#PCDATA)> <!ELEMENT revisores (revisor)*> <!ELEMENT revisor (nombre,resultado,comentarios)> <!ELEMENT nombre (#PCDATA)> <!ELEMENT resultado (#PCDATA)> <!ELEMENT comentario (#PCDATA)>]>
XQUERY Para tener listo una base de datos para hacer consultas, basta con cargarla en el BaseX Si en vez de devolver todo el docuemnto, se quiere acceder nicamente a un conjunto de nodos bien identificado, aadiramos el camino en el rbol para acceder a ellos, por ejemplo, los libros: Doc(Biblioteca.xml)//Libros/Libro

Como se puede observar, aparecen todos los libros que haba almacenados en el documento XML inicial, con sus ttulo resaltados. Al igual que con las expresiones XSLT es posible que se quiera solo un conjunto de nodos dependiendo de un patrn de bsqueda. Si queremos todos los libros que se hayan publicado antes de 1970, la consulta se puede completar de la siguiente manera: Doc(Biblioteca.xml)//Libros/Libro[@ao<1970]

Los ejemplos anteriores son la manera sencilla de realizar bsquedas y selecciones de nodos concretos en un documento XML. Pero existe otra manera mucho ms potente, para realizar este trabajo. Es lo que se denomina expresiones FLWOR. FLWOR es la contraccin del acrnimo For, Let, Where, Order by, Return. A continuacin se explicarn para qu sirven cada una de las clasulas FLWOR For: Esta sentencia permite seleccionar los nodos que se quierne consultar, guardndose en la variable (el identificador que le precede es el smbolo $) Let: Esta clausula es opcional. Esta sentencia establece una nueva variable sobre el mismo u otro documento XML. Permite simplificar las expresiones posteriores y tener un cdigo mucho ms legible Where: Clausula que permite establecer una condicin sobre la variable indicada en for y let Order by. Clausula que define el orden de presentacin de resultados. Return: Permite devolver un valor concreto de los resultados obtenidos de las anteriores clausulas (Una por nodo) Cabe destacar que la utilizacin de expresiones FLWOR resulta tremendamente similar a las consultas realizadas en SQL en las bases de datos relacionales. Usaremos estas expresiones para extraer la informacin de nuestras bases de datos CONSULTAS Antes de continuar, se va a crear un nuevo documento XML y se aadir en la base de datos. La razn fundamental es que necesitamos un documento ms denso para poder realizar ejemplos complejos. Imaginemos que tenemos un conocido que se gana la vida con una academia de bailes de saln. Nos pide ayuda para almacenar informacin que considera fundamental en su negocio. Estos datos son: - Nombre del baile - Precio de la clase(Indicando la periodicidad de la misma y la moneda de pago - Nmero de plazas disponibles - Fecha de comienzo de las clases - Fecha de finalizacin de las clases - Nombre del profesor que la imparte - Sala en la que se desarrollar la clase Tras un perodo recogiendo los datos y plasmandolos en XML, el documento queda de la siguiente manera:

<?xml version="1.0" encoding="iso-8859-1"?> <Bailes> <baile id="1"> <nombre>Tango</nombre> <precio cuota="mensual" moneda="euro">27</precio> <plazas>20</plazas> <comienzo>1/1/2011</comienzo> <fin>1//12/2011</fin> <profesor>Roberto Garcia</profesor> <sala>1</sala> </baile> <baile id="2"> <nombre>Cha-cha-cha</nombre> <precio cuota="trimestral" moneda="euro">80</precio> <plazas>18</plazas> <comienzo>1/2/2011</comienzo> <fin>31/7/2011</fin> <profesor>Miriam Gutirrez</profesor> <sala>1</sala> </baile> <baile id="3"> <nombre>Rock</nombre> <precio cuota="mensual" moneda="euro">30</precio> <plazas>15</plazas> <comienzo>1/1/2011</comienzo> <fin>1/12/2011</fin> <profesor>Laura Mendiola</profesor> <sala>1</sala> </baile> <baile id="4"> <nombre>Merengue</nombre> <precio cuota="trimestral" moneda="dolares">75</precio> <plazas>12</plazas> <comienzo>1/1/2011</comienzo> <fin>1/12/2011</fin> <profesor>Jesus Lozano</profesor> <sala>2</sala> </baile> <baile id="5"> <nombre>Salsa</nombre> <precio cuota="mensual" moneda="euro">32</precio> <plazas>10</plazas> <comienzo>1/1/2011</comienzo> <fin>1/12/2011</fin> <profesor>Jesus Lozano</profesor> <sala>2</sala> </baile> <baile id="6"> <nombre>Pasodoble</nombre>

<precio cuota="anual" moneda="euro">320</precio> <plazas>8</plazas> <comienzo>1/1/2011</comienzo> <fin>31/12/2011</fin> <profesor>Miriam Gutierrez</profesor> <sala>1</sala> </baile> </Bailes> Para poder trabajar con esta base de datos, tenemos que cargar el documento en nuestro servidor de bases de datos, que tpicamente estar en C:\Program Files (x86)\BaseX Nuestra primera consulta es ver qu bailes se realizan en la sala nmero 1 for $baile in doc("Bailes.xml")//Bailes/baile where $baile/sala =1 return $baile/nombre Se incluye en el men Edicin y se hace clic en el botn verde. El resultado es el siguiente:

Como puede observarse los resultados salen con las etiquetas de XML. Si quisiramos solo tener un listado, obviando las etiquetas, simplemente tendramos que indicar en la clausula return que extraiga los datos de ese elemento XML for $baile in doc("Bailes.xml")//Bailes/baile

let $n:=$baile/nombre where $baile/sala =1 return data($n) El resultado es:

Tal y como se ve, los resultados ya no estn con las etiquetas del elemento nombre. Todo es el debido a que existe una funcin llamada data(<variable>), que extrae del nodo la informacin almacenada Ejemplo 2 Se necesita extraer los nodos de aquellos bailes que se impartan en la sala nmero 2 y cuyo importe sea menor que 35 Euros for $baile in doc("Bailes.xml")//Bailes/baile let $n:=$baile/nombre where $baile/sala =2 and $baile/precio<35 and $baile/precio[@moneda=euro] return $n El resultado es:

Ejemplo 3 Se necesita saber el nombre de los profesores que dan clases con cuotas mensuales for $baile in doc("Bailes.xml")//Bailes/baile let $profesor:=$baile/profesor where $baile/precio[@cuota=mensual] return $profesor Y el resultado es:

Estos tres ejemplos han permitido descubrir las grandes similitudes que tiene XQuery con SQL. Una de las ventajas de XQuery es que devuelve los nodos del rbol XML, por lo que cualquier programa o aplicacin puede trabajar con los resultados que la consulta devuelva Ahora, queremos una consulta XQuery cuyo resultado sea que nos muestre el nombre del baile, el profesor que lo imparte y el nmero de plazas ofertadas: for $baile in doc("Bailes.xml")//Bailes/baile let $nombre:=$baile/nombre let $profesor:=$baile/profesor let $plazas:=$baile/plazas return concat (data($nombre), " ", data($profesor), " ", data($plazas)) Que tiene como resultado:

Ejercicios a realizar: 1. Terminar el ejercicio del men 2. Incluir la siguiente informacin en un documento XML, y realizar un XSL que la muestre de forma similar a la que se muestra aqu:

3. Implementar el documento Bailes.xml y comprobar todos los ejercicios de XPath realizados hasta el momento. 4. Hacer un documento Bailes.xsl que formatee la salida de la informacin del anterior documento en un navegador.

Anda mungkin juga menyukai