XQuery

‡ Xquery es una especificación W3C ‡ documentos XML necesito lenguaje sencillo para efectuar consultas permiten extraer info específica y aisla los resultados ‡ podemos sacar los productos superiores a un precio de un documento XML para mostrar un catalogode venta

‡ Xpath 2.0:
± diseña los objetos de un documento XML ± direcciona los nodos de los árboles ± está incluido en Xquery

‡ la expresión designa una combinación
± valores ± variables de operadores ± función

‡ interpretada por un programa que genera un resultado ‡ Xquery es un lenguaje de expresión

‡ Xquery utiliza una sintaxis sensible a mayus y minus ‡ los elementos, atributos y variables deben tener nombres válidos en XML

Xquery y SQL
‡ se compara Xquery con SQL o lenguaje de consulta estructurada ‡ SQL está vinculado a relaciones y operaciones de conjuntos
± union intereseccion - diferencia

‡ los dos lenguajes de consulta son parecidos
± ambos permiten realizar consultas en documentos XML y SBGDR ± tb hay similutides en sintaxis como en las expresiones FLOWR

Diferencias entre Xquery y SQL
‡ Xquery recorre datos jerarquitos y SQl datos relacionales. ‡ SQL permite eliminar y modificar datos ‡ Xquery no permite borrar o editar datos directamente de la fuente

Procesador XQuery
‡ para usar Xquery
± editor de texto ± procesador Xquery
‡ programa que realiza las consultas y genera el resultado ‡ hay varios
± java, .net ± altovaXML ± Oxigen

Ejemplo menu.xml
‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ <?xml version="1.0"?> <menu> <plato> <frio>ensalada</frio> <frio>entremeses</frio> <caliente>patatas fritas</caliente> <caliente>hamburguesa</caliente> </plato> </menu>

‡ queremos extraer del documento solo los platos fríos ‡ creamos un fichero xquery ‡ ‡ ‡ ‡ ponemos doc( rutaficheroxml/nombrexml ) //menu/plato/frio doc('menu.xml') //menu/plato/frio

consultamenu.xquery
‡ doc('menu.xml') //menu/plato/frio ‡ cuidado no poner / al final que da error

Lenguaje
‡ Con Xquery podemos extraer los resultado de un documento XML de nuestro equipo de o de un servidor. ‡ la sintaxis son:
± doc( rutafichero ) ± doc( http://rutafichero )

‡ Xquery permite utililizar los argumentos de los elementos de un documento XML ‡ doc( ruataficheroxml ) //nodo[@argumento expresion] ‡ doc( ficheroxml )//producto[@precio=50]

Comentarios
‡ (: esto es un comentario en Xquery :)

Posicion en un arbol
‡ para obtener elementos específicos en un arbol, debemos indicar el documento sobre el que trabajamos ‡ después añadir un espacio, dos barras y el o los elementosdeseados ‡ doc( fichero.xml )//empresa//marketing/salari o

Expresiones comparaciones generales
‡ las expresiones de comparación es como en el resto de programas ‡ doc( fichero.xml )//producto[@precio>=50] ‡ si hacemos operaciones con cadenas de caracteres las ponemos entre comillas ‡ doc( fichero.xml )//empleado[@ciudad= Madrid ]

Comparación de valores
‡ las expresiones de comparación utilizan las palabras claves ‡ eq, ne, lt, gt, ge, le ‡ equal, no equal, less than, greater than, greater or equal, less or equal ‡ doc( fichero.xml ) //familia/niño[./nombre eq juan ]

‡ la compración de valores necesita definir los tipos con XMLSchema
± si no, el procesador devuelve error indicando que los tipos no corresponde

‡ las comparaciones generales no pasa esto. ‡ debemos usar las comparaciones de valor con los documentos XML con tipos definidos

Comparacion de nodos
‡ comparamos un nodo consigo mismo ‡ usamos is ‡ doc( fichero.xml )//producto/pedido[1] is ‡ doc ( fichero.xml //producto/pedido[1]
± el resutlado será true ± no es muy util asi, pero con las expresiones FLWOR será muy util

‡ podemos tb comparar el orden de aparición de los nodos ‡ se usa el operador < y > ‡ doc( fichero.xml )//producto/pedido[1] < ‡ doc ( fichero.xml //producto/descuento[1] ‡ sera true si el nodo pedido se encuentra antes que el nodo descuento

Expresiones condicionales
‡ permiten limitar los resultados a las condiciones de las expresiones introducidas ‡ ‡ ‡ ‡ ‡

if(<expresion1>) then <expresion2> else <expresion3>

‡ es imprescindible usar else. ‡ si no queremos mostrar nada, tras else ponemos parentesis vacios

alumnos.xml
‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡
<?xml version="1.0" encoding="ISO-8859-1"?> <familia> <niño edad="15" poblacion="Madrid"> <nombre>Miguel</nombre> <pelo>Moreno</pelo> <edad>15</edad> <info>Información sobre Miguel</info> </niño> <precio>55</precio> <niño edad="10" poblacion="Bilbao"> <nombre>Natalia</nombre> <pelo>Blonde</pelo> <info>Información sobre Natalia</info> </niño> <precio>80</precio> </familia>

‡ consulta que devuelva los nombres de los niños de 15 años o muestra la etiqueta no encontrado

consultaif.xquery
‡ if (doc( alumnos.xml') //familia/niño[@edad=15]) ‡ then <selection>{doc( alumnos.xml') //familia/niño/nombre}</selection> ‡ else <no_encontrado></no_encontrado>

Expresion de conjunto
‡ podemos realizar operaciones de unión, intersección y excepción

union
‡ operador union, agrupa dos arboles que pueden proceder de documentos distintos ‡ doc( alumnos.xml') //familia/niño union doc( alumnos.xml') //familia

intersect
‡ da un conjunto en el que los elementos del primero se conservan solo cuando aparezcan en el segundo

‡ la consulta de unión de nombres y color de pelo de los niños del arbol familia y la interseccion de esta union con el nombre de los niños

‡ doc('alumnos.xml') //familia/niño/nombre union doc('alumnos.xml') //familia/niño/pelo intersect doc('alumnos.xml') //familia/niño/nombre

except
‡ los elementos del primer arbol se muestra cuando NO estén en el segundo

‡ obtener niños del arbol familia que NO tengan 15 años

‡ doc('alumnos.xml') //familia/niño except doc('alumnos.xml') //familia/niño[@edad=15]

Variables
‡ permiten contener una expresión y pueden ser reutilizadas ‡ se escriben como en php o perl ‡ $mivariable

expresiones FLWOR
‡ For let Where order return ‡ instrucciones que permiten no solo realizar consultas, sino tb explotar los resultados a lo largo de las consultas

for, in y return
‡ for indica que se va a realizar un iteración en un arbol XML ‡ in indica sobre qué arbol ‡ return recupera el resultado

Sintaxis for in return
‡ for $variable in arbol ‡ return $variable

‡ devolver los nombres de todos los niños del arbol familia

‡ <mietiqueta> { for $a in doc('alumnos.xml') //familia/niño/nombre return $a } </mietiqueta>

‡ podemos incluir codigo html usando como etiqueta ‡ asi, con Xquery podemos obtener un resultado con forma de codigo html y xml

iteracion dentro de interacion
‡ for realiza una iteracion ‡ podemos realizar una iteracion dentro de otra usando llaves ‡ en el interior de una etiquta bucle, recorremos el elemento familia ‡ dentro de una etiqueta eleccion1, recorremos los nombres de los niños de arbol familia

forfor
‡ <bucle> { for $a in doc('alumnos.xml') //familia return <eleccion> <eleccion1> { for $b in doc('alumnos.xml') //familia/niño/nombre return $b }</eleccion1> </eleccion> } </bucle>

let
‡ podemos asignar un valor a una variable ‡ su sintaxis es ‡ let $variable:=mivalor ‡ como let $nombre:= $a

‡ en un bucle
± consulta que hace un bucle en el arbol familia ± la variable nombre contiene los nombres de los niños del arbol familia ± al final, la consulta devuelve la variable nombre ± es decir, los nombres de cada niño del arbol familia

‡ for $a in doc('alumno.xml') //familia let $nombre := $a/niño/nombre return $nombre

where
‡ con for podemos hacer iteraciones ‡ podemos restringir estas iteraciones usando where ‡ se utiliza en el contenido de un elemento ‡ su sintaxis es ‡ where variable condicion

‡ si queremos indicar que la edad es superior a 10 ‡ where edad >10

‡ consulta que devuelva los niños cuyo color de pelo es moreno

where
‡ for $a in doc('alumnos.xml') //familia/niño where $a/pelo = "Moreno" return $a ‡ en sql escribiriamos ‡ select * from mitable where condicion

order
‡ podemos mostrar un resultado en orden alfabético o numerico ‡ para obtener orden ascendente, asociamos a order la palabra clave ascending y descending ‡ si no dices nada, es acedending ‡ su sintaxis es ‡ order by variable [ascending, descending]

‡ consulta que devuelva los nombres de los niños del arbol familia en orden descendente

descending
‡ for $a in doc('alumnos.xml') //familia/niño/nombre order by $a descending return $a

Expresiones cuantificada some y every
‡ con for, in y return podemos realizar una iteracion en una expresion Xquery ‡ podemos mejorar con where y order ‡ con las palabras clave some y every, podemos en un iteración devolver los resultados que satisfagan una restriccion (some) o todos los resultados que satisfagan una restricción (every)

‡ podemos obtener lo buscado, en parte o completamente sin crear un contador

‡ obtener los nombres de los niños cuya edad se haya introducido

some
‡ for $nombre in doc("alumnos.xml") //familia where some $nombre in $nombre/niño satisfies $nombre[@edad=15] return $nombre

funciones
‡ incluidas en xquery
± si no se dice otra cosa, xquery devuelve un resultado en forma de arbol o subarbol ± para obtener otro resultado, usamos funciones ± una funcion lleva un nombre y termina con parentesis
‡ para obtener el texto de un resultado usamos la funcion text()

‡ para contar el numero de resultados usamos count() ‡ xquery ofrece gran variedad de funciones ‡ gestionan cadenas, nodos de los arboles, numeros y fechas ‡ podemos consultar la documentacion de xquery

‡ tb podemos crear nuestras propias funciones ‡ declaramos la funcion, el tipo de variable que utilizamos y escribir su comportamiento ‡ comenzamos con declare ‡ dejamos un espacio y añadimos function ‡ siempre un espacion despues, un prefijo , dos puntos y el nombre de uvnion ‡ el prefijo indica el espacio de nombe en el que trabajamos

‡ despues, dentro de los parentesis, indicamos si existe el tipo de parametros que utiliza la funcion ‡ depues separado por un espacion ‡ con la palabra as, el tipo que devuelve la funcion

‡ declare function local:mifuncion($parametro as xs:type?) as xs:type? { ‡ //procedimiento de la funcion ‡ };

‡ funcion que calcule un precio antes de impuestos de una factura. iva 16%

funcion.xq
‡ declare function local:precioAI($numero as xs:decimal) as xs:decimal { ‡ $numero div 1.196 ‡ }; ‡ local:precioAI(25.30)

uniones
‡ es una consulta que se ejerce sobre los arboles XML, vinculados entre ellos por elementos comunes ‡ por ejemplo, un arbol xml que representa las ventas de libros y un arbol xml que representa los libros

venta.xml
‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ ‡ <?xml version="1.0" encoding="UTF-8"?> <libros> <titulo>La sombra del viento</titulo> <titulo>Ulises</titulo> <titulo>La noria</titulo> <titulo>El Quijote</titulo> <titulo>César</titulo> <titulo>La colmena</titulo> </libros>

libro.xml
‡ ‡ ‡ ‡

<?xml version="1.0" encoding="UTF-8"?> <titulos> <item>La colmena</item> <item>La sombra del viento</item>

‡ </titulos>

unionfinal.xq
‡ for $a in doc('venta.xml') //libros/titulo let $b := doc('libro.xml') //titulos/item where $a = $b return $a

‡ nos muestra los titulos de los libros del documento venta que corresponden con entradas en el fichero libro

Sign up to vote on this title
UsefulNot useful