Bases de Datos – XPath - XQuery 1
XML: XPath - XQuery
Jorge Perez Rojas
Universidad de Talca, II Semestre 2006
Bases de Datos – XPath - XQuery 2
XPath - XQuery
Ambos son estandares para acceder y obtener datos desde de un
XML
Toman en cuenta que la info esta semiestructurada como arbol
XPath es un lenguaje para referirse a caminos dentro de un XML
(caminos en el sentido del arbol de XML visto como un grafo)
XQuery es un lenguaje mas completo con funcionalidades similares
a SQL.
Bases de Datos – XPath - XQuery 3
XML de Ejemplo: Empresa
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
Bases de Datos – XPath - XQuery 4
Descriptores de Caminos
Sirven para seleccionar elementos que se encuentran en cierto
camino en el arbol.
Los descriptores se forman simplemente nombrando tags
separados por /.
Si el descriptor comienza con / se supone que es un camino desde
la raız.
Si el descriptor comienza con // se supone que el camino descrito
puede comenzar en cualquier parte en el arbol.
Implıcitamente se supone que todos los descriptores se refieren a
caminos que avanzan en la profundidad del arbol.
Bases de Datos – XPath - XQuery 5
Descriptores de Caminos: Ejemplo
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario=’’200000’’>
<rut>10934412</rut>
<nombre>Parra</nombre>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
El descriptor /Empresa/departamento/empleado
selecciona a todos los tags que corresponden
a empleados de la empresa.
Bases de Datos – XPath - XQuery 6
Descriptores de Caminos: Ejemplo (cont.)
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
El desciptor
/Empresa/departamento/empleado/nombre
selecciona la lista de todos los tag
nombre de todos los empleados en la
empresa.
Bases de Datos – XPath - XQuery 7
Descriptores de Caminos: Ejemplo (cont.)
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
El desciptor //nombre selecciona la lista
de todos los tag nombre en cualquier
lugar del documento.
En este caso se obtienen los nombres de
los departamentos y de los empleados.
Bases de Datos – XPath - XQuery 8
Descriptores de Caminos: Ejemplo (cont.)
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
El desciptor
//empleado/nombre selecciona la lista de
todos los tag nombre que son hijos de
un tag empleado en el arbol, partiendo
desde cualquier punto.
En este caso obtenemos el mismo re-
sultado que en el primer ejemplo.
Bases de Datos – XPath - XQuery 9
Operador *: Ejemplo
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
El * se usa para nombrar a cualquier
tag, se usa como comodın.
El desciptor /*/*/nombre selecciona la
lista de todos los tag nombre que se en-
cuentran a dos niveles de profundidad
desde la raiz.
En este caso se obtienen solo los nom-
bres de los departamentos.
¿Que se obtiene con el descriptor
//*/*/*/nombre?
Bases de Datos – XPath - XQuery 10
Atributos
Para referirse a los atributos de los elementos se usa @ antes del
nombre, por ejemplo @telefono.
En un descriptor de camino los atributos se nombran como si
fueran tag hijos pero anteponiendo @.
Bases de Datos – XPath - XQuery 11
Atributos: Ejemplo
<Empresa>
<departamento telefono="8741460" >
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
El descriptor
\Empleado\departamento\@telefono selecciona
los telefonos de los departamentos de la em-
presa.
Bases de Datos – XPath - XQuery 12
Condiciones de Seleccion
En un descriptor una condicion entre parentesis cuadrados [...]
puede seguir al nombre de un tag o atributo (sin usar /).
En este caso se seleccionan los elementos que siguen el camino del
descriptor pero que ademas cumplen la condicion especificada.
En las condiciones se pueden usar comparadores (<, >, <=, >=, =,
!=) y conectivos logicos (or, and).
Bases de Datos – XPath - XQuery 13
Condiciones: Ejemplo
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
La expresion
/Empresa/departamento/empleado[@salario > 500000]
selecciona los elementos empleados tales
que su atributo salario es mayor a 500000.
Bases de Datos – XPath - XQuery 14
Condiciones: Ejemplo (cont.)
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario=’’200000’’>
<rut>10934412</rut>
<nombre>Parra</nombre>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
La expresion
//departamento[codigo=B02]/empleado/nombre
selecciona los nombre de los empleados del
departamento con codigo B02.
Bases de Datos – XPath - XQuery 15
Predicados
Las condiciones de seleccion son un tipo especial de predicados
que se usan para dirigir la busqueda por el arbol.
En general un predicado, que tambien se escribe entre parentesis
cuadrados luego de un elemento (o atributo), puede ser una
expresion general para dirigir la busqueda.
Se pueden usar funciones construidas (last, count, etc.) o
expresiones matematicas (usando +, -, *, div, etc.)
Bases de Datos – XPath - XQuery 16
Predicados: Ejemplo
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
La expresion
\Empresa\departamento[1]\empleado\rut
entrega el rut de los empleados del primer
elemento departamento en el documento.
Por ejemplo la expresion
\Empresa\departamento\empleado[last()]\rut
entregarıa el rut del ultimo elemento em-
pleado de cada departamento en el arbol, y
\Empresa\departamento\empleado[last()-1]\rut
el rut del penultimo elemento empleado en
el arbol.
Bases de Datos – XPath - XQuery 17
Predicados: Ejemplo(cont.)
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
La funcion count se usa para contar elemen-
tos.
Por ejemplo la expresion
\Empresa\departamento[count(empleado)>1]\codigo
entrega el elemento codigo de todos los
departamentos que tienen mas de un
(elemento) empleado.
Bases de Datos – XPath - XQuery 18
Axes
Hasta ahora solo hemos visto descriptores de caminos que bajan
por el arbol.
En general un camino se puede describir para partir en la raız del
arbol y luego ejecutar una secuencia de pasos para recorrer el
arbol y encontrar los nodos que se necesitan.
En cada paso se puede seguir una de varias direcciones (axes).
La direccion por defecto es child::--- que significa “seguir por
cualquiera de los hijos del elemento actual”.
Bases de Datos – XPath - XQuery 19
Axes: Ejemplo
El descriptor /Empresa/departamento es realmente una forma
abreviada del descriptor /Empresa/child::departamento.
En este ultimo se ha hecho explıcito el deseo de seguir por los
hijos de Empresa.
El @ es simplemente una abreviacion de la direccion attribute::
El descriptor
/Empresa/departamento[@telefono = "2354928"] es
entonces una forma abreviada de
/Empresa/child::departamento[attribute::telefono = "2354928"].
Bases de Datos – XPath - XQuery 20
Mas sobre Axes
Existen muchas otras direcciones que se pueden seguir.
parent:: para seguir por los padres de un elemento.
descendant:: para indicar a todos los descendientes y
descendant-or-self:: para indicar al nodo actual y todos sus
descendientes (note que // resulta ser simplemente una
abreviacion de esta direccion).
ancestor::, ancestor-or-self::, ancestor-or-self::,
following-sibling::, preceding-sibling::, etc.
Bases de Datos – XPath - XQuery 21
Axes: Ejemplo
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
La expresion
\\nombre[nombre = ’Gonzalez’]\parent::empleado\rut
entrega el rut del empleado de nombre Gon-
zalez.
La busqueda se realiza primero encontrando
un nodo nombre con contenido Gonzalez, se
sigue avanzando hacia el padre que debiera
ser un elemento empleado, y luego al subele-
mento (hijo) rut.
Bases de Datos – XPath - XQuery 22
Axes: Ejemplo (cont.)
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
La expresion
\\Empresa\descendant::nombre
obtendrıa todos los elementos nombre de-
scendientes del elemento Empresa, en nue-
stro caso, los nombres de departamentos y
empleados.
¿Que se obtiene con
\\nombre\descendant::nombre? y con
\\nombre\descendant-or-self::nombre?
Bases de Datos – XPath - XQuery 23
Axes: Ejemplo (cont.)
<Empresa>
<departamento telefono="8741460">
<codigo>B02</codigo>
<nombre>Marketing</nombre>
<empleado salario="200000">
<rut>10934412</rut>
<nombre>Parra</nombre>
</empleado>
<empleado salario="600000">
<rut>12008991</rut>
<nombre>Chavez</nombre>
</empleado>
...
</departamento>
<departamento telefono="2354928">
<codigo>A03</codigo>
<nombre>Finanzas</nombre>
<empleado salario="1000000">
<rut>881672</rut>
<nombre>Gonzalez</nombre>
</empleado>
...
</departamento>
...
</Empresa>
La expresion
\\empleado[nombre=’Parra’]\following-sibling::empleado
obtendrıa el elemento empleado siguiente
(como nodo en el documento) al empleado
de nombre Parra.
Bases de Datos – XPath - XQuery 24
XPath
En general el estandard XPath cuenta con una extensa
funcionalidad.
Por ejemplo funciones para manejo de strings, conversion
numerica, fecha y horas, funciones de agregacion tıpicas , etc. etc.
Una referencia completa se puede encontrar en
http://www.w3.org/TR/xpath
Bases de Datos – XPath - XQuery 25
Importancia de XPath
La principal: se encuentra en “el corazon” de todos los estandares
mas avanzados de XML.
XPath
XQuery XLinkXPointer
XSLT
Bases de Datos – XPath - XQuery 26
XQuery
XQuery es un lenguaje de consulta para consultar documentos
XML.
Lo mas simple es pensar que XQuery es a XML como SQL es a las
tablas relacionales.
XQuery contiene a XPath → toda expresion de consulta en XPath,
es tambien valida (y entrega el mismo resultado) en XQuery.
Pero XQuery permite mucho mas...
Bases de Datos – XPath - XQuery 27
XQuery
Similar a como en SQL se usaba select-from-where , en
XQuery usaremos for-where-return con algunas inclusiones
adicionales.
Por ejemplo el siguiente es un camino en XPath (note el archivo
explıcito):
doc("empresa.xml")\Empresa\departamento\empleado[@salario>500000]\nombre
es valido tambien en XQuery.
Pero usando for-where-return se puede obtener un resultadoequivalente:
for $x in doc("empresa.xml")\Empresa\departamento\empleado
where $x\@salario > 500000
return $x\nombre
Bases de Datos – XPath - XQuery 28
XQuery – Sintaxis
En la consulta
for $x in doc("empresa.xml")\Empresa\departamento\empleado
where $x\@salario > 500000
return $x\nombre
• for se usa para seleccionar nodos y almacenarlos en una
variable $x
• where se usa para discriminar algunos de los nodos
seleccionados
• return se usa para especificar que se quiere retornar
Todas las variables en XQuery comienzan con $
Bases de Datos – XPath - XQuery 29
XQuery – Sintaxis (cont.)
En general la sintaxis de una expresion simple en XQuery es:
for <variable> in <expresion XPath>
where <condicion XPath>
return <expresion de salida>
El where puede ser omitido si se quieren seleccionar todos los
nodos sin restriccion.
El return puede ser condicional (usando if)y ası tener mas
versatilidad en la salida
Ademas el return puede especificar mas que simplemente
expresiones XPath, puede mezclar tags XML que tambien se
quieran a la salida.
Bases de Datos – XPath - XQuery 30
XQuery – Ejemplo
En la siguiente expresion
for $emp in doc("empresa.xml")\\empleado
return if ($emp\@salario > 1000000)
then <importante>{data($emp\nombre)}</importante>
else <normal>{data($emp\nombre)}</normal>
el resultado debiera ser algo como
...
<importante>Soto</importante>
<normal>Perez</normal>
...
Note la sintaxis del if-then-else y el uso de la funcion data.
Bases de Datos – XPath - XQuery 31
XQuery – Ejemplo (cont.)
Una expresion XQuery puede tambien llevar un preambulo lo quenos permite por ejemplo generar paginas html:
<html>
<body>
<ul>
{
for $emp in doc("empresa.xml")\\empleado
return if ($emp\@salario > 1000000)
then <li><strong>{data($emp\nombre)}</strong></li>
else <li>{data($emp\nombre)}</li>
}
</ul>
</body>
</html>
que resulta en una pagiuna con una lista de los empleados
enfatizando a los importantes.
Bases de Datos – XPath - XQuery 32
XQuery
Hay mucho que decir acerca de XQuery (tanto o mas que acerca
de XPath).
Aun no es un estandard en la Web, pero ya esta siendo muy usado.
Una referencia completa se puede encontrar en
http://www.w3.org/TR/xquery