You are on page 1of 69

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

You might also like