xpq.pdf

32
Bases de Datos – XPath - XQuery 1 XML: XPath - XQuery Jorge P´ erez Rojas Universidad de Talca, II Semestre 2006

Upload: josemaria181159

Post on 07-Aug-2015

17 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: xpq.pdf

Bases de Datos – XPath - XQuery 1

XML: XPath - XQuery

Jorge Perez Rojas

Universidad de Talca, II Semestre 2006

Page 2: xpq.pdf

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.

Page 3: xpq.pdf

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>

Page 4: xpq.pdf

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.

Page 5: xpq.pdf

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.

Page 6: xpq.pdf

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.

Page 7: xpq.pdf

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.

Page 8: xpq.pdf

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.

Page 9: xpq.pdf

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?

Page 10: xpq.pdf

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 @.

Page 11: xpq.pdf

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.

Page 12: xpq.pdf

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).

Page 13: xpq.pdf

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.

Page 14: xpq.pdf

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.

Page 15: xpq.pdf

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.)

Page 16: xpq.pdf

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.

Page 17: xpq.pdf

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.

Page 18: xpq.pdf

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”.

Page 19: xpq.pdf

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"].

Page 20: xpq.pdf

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.

Page 21: xpq.pdf

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.

Page 22: xpq.pdf

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?

Page 23: xpq.pdf

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.

Page 24: xpq.pdf

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

Page 25: xpq.pdf

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

Page 26: xpq.pdf

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...

Page 27: xpq.pdf

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

Page 28: xpq.pdf

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 $

Page 29: xpq.pdf

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.

Page 30: xpq.pdf

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.

Page 31: xpq.pdf

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.

Page 32: xpq.pdf

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