Está en la página 1de 32

Bases de Datos XPath - XQuery

XML: XPath - XQuery


Jorge Prez Rojas e Universidad de Talca, II Semestre 2006

Bases de Datos XPath - XQuery

XPath - XQuery
Ambos son estndares para acceder y obtener datos desde de un a XML Toman en cuenta que la info est semiestructurada como rbol a a XPath es un lenguaje para referirse a caminos dentro de un XML (caminos en el sentido del rbol de XML visto como un grafo) a XQuery es un lenguaje ms completo con funcionalidades similares a a SQL.

Bases de Datos XPath - XQuery

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

Descriptores de Caminos
Sirven para seleccionar elementos que se encuentran en cierto camino en el rbol. a 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 rbol. a Impl citamente se supone que todos los descriptores se reeren a caminos que avanzan en la profundidad del rbol. a

Bases de Datos XPath - XQuery

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

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

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

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 selecciona la lista de todos los tag nombre que son hijos de un tag empleado en el rbol, partiendo a desde cualquier punto.
//empleado/nombre

En este caso obtenemos el mismo resultado que en el primer ejemplo.

Bases de Datos XPath - XQuery

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 encuentran a dos niveles de profundidad desde la raiz. En este caso se obtienen slo los nomo bres de los departamentos. Qu se obtiene con el descriptor e //*/*/*/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 selecciona los telefonos de los departamentos de la empresa.


\Empleado\departamento\@telefono

Bases de Datos XPath - XQuery

12

Condiciones de Seleccin o
En un descriptor una condicin entre parntesis cuadrados [...] o e 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 adems cumplen la condicin especicada. a o En las condiciones se pueden usar comparadores (<, >, <=, >=, =, !=) y conectivos lgicos (or, and). o

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 expresin o
/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 expresin o
//departamento[codigo=B02]/empleado/nombre

selecciona los nombre de los empleados del departamento con cdigo B02. o

Bases de Datos XPath - XQuery

15

Predicados
Las condiciones de seleccin son un tipo especial de predicados o que se usan para dirigir la bsqueda por el rbol. u a En general un predicado, que tambin se escribe entre parntesis e e cuadrados luego de un elemento (o atributo), puede ser una expresin general para dirigir la bsqueda. o u Se pueden usar funciones construidas (last, count, etc.) o expresiones matemticas (usando +, -, *, div, etc.) a

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 expresin o
\Empresa\departamento[1]\empleado\rut

entrega el rut de los empleados del primer elemento departamento en el documento. Por ejemplo la expresin o
\Empresa\departamento\empleado[last()]\rut

entregar el rut del ultimo elemento ema pleado de cada departamento en el rbol, y a
\Empresa\departamento\empleado[last()-1]\rut

el rut del penltimo elemento empleado en u el rbol. a

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 funcin count se usa para contar elemeno tos. Por ejemplo la expresin o
\Empresa\departamento[count(empleado)>1]\codigo

entrega el elemento cdigo de todos los o departamentos que tienen ms de un a (elemento) empleado.

Bases de Datos XPath - XQuery

18

Axes
Hasta ahora slo hemos visto descriptores de caminos que bajan o por el rbol. a En general un camino se puede describir para partir en la ra del z rbol y luego ejecutar una secuencia de pasos para recorrer el a rbol y encontrar los nodos que se necesitan. a En cada paso se puede seguir una de varias direcciones (axes). La direccin por defecto es child::--- que signica seguir por o 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 abreviacin de la direccin attribute:: o o El descriptor /Empresa/departamento[@telefono = "2354928"] es entonces una forma abreviada de
/Empresa/child::departamento[attribute::telefono = "2354928"].

Bases de Datos XPath - XQuery

20

Ms sobre Axes a
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 abreviacin de esta direccin). o o 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 expresin o
\\nombre[nombre = Gonzalez]\parent::empleado\rut

entrega el rut del empleado de nombre Gonzalez. La bsqueda se realiza primero encontrando u un nodo nombre con contenido Gonzalez, se sigue avanzando hacia el padre que debiera ser un elemento empleado, y luego al subelemento (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 expresin o
\\Empresa\descendant::nombre

obtendr todos los elementos nombre dea scendientes del elemento Empresa, en nuestro caso, los nombres de departamentos y empleados. Qu se obtiene con e \\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 expresin o
\\empleado[nombre=Parra]\following-sibling::empleado

obtendr el elemento empleado siguiente a (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, conversin o numrica, fecha y horas, funciones de agregacin t e o 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 corazn de todos los estndares o a ms avanzados de XML. a

XSLT

XPath XQuery XPointer XLink

Bases de Datos XPath - XQuery

26

XQuery
XQuery es un lenguaje de consulta para consultar documentos XML. Lo ms simple es pensar que XQuery es a XML como SQL es a las a tablas relacionales. XQuery contiene a XPath toda expresin de consulta en XPath, o es tambin vlida (y entrega el mismo resultado) en XQuery. e a Pero XQuery permite mucho ms... a

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 vlido tambin en XQuery. a e Pero usando for-where-return se puede obtener un resultado equivalente:
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 especicar 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 expresin simple en XQuery es: o
for <variable> in <expresin XPath> o where <condicion XPath> return <expresin de salida> o

El where puede ser omitido si se quieren seleccionar todos los nodos sin restriccin. o El return puede ser condicional (usando if)y as tener ms a versatilidad en la salida Adems el return puede especicar ms que simplemente a a expresiones XPath, puede mezclar tags XML que tambin se e quieran a la salida.

Bases de Datos XPath - XQuery

30

XQuery Ejemplo
En la siguiente expresin o
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 funcin data. o

Bases de Datos XPath - XQuery

31

XQuery Ejemplo (cont.)


Una expresin XQuery puede tambin llevar un preambulo lo que o e nos permite por ejemplo generar pginas html: a
<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 pgiuna con una lista de los empleados a enfatizando a los importantes.

Bases de Datos XPath - XQuery

32

XQuery
Hay mucho que decir acerca de XQuery (tanto o ms que acerca a de XPath). Aun no es un estandard en la Web, pero ya est siendo muy usado. a Una referencia completa se puede encontrar en http://www.w3.org/TR/xquery

También podría gustarte