Bases de Datos XPath - XQuery 1 XML: XPath - XQuery Jorge Pérez Rojas Universidad de Talca, II Semestre 2006
Bases de Datos XPath - XQuery 2 XPath - XQuery Ambos son estándares para acceder y obtener datos desde de un XML Toman en cuenta que la info está semiestructurada como árbol XPath es un lenguaje para referirse a caminos dentro de un XML (caminos en el sentido del árbol de XML visto como un grafo) XQuery es un lenguaje más 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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa>
Bases de Datos XPath - XQuery 4 Descriptores de Caminos Sirven para seleccionar elementos que se encuentran en cierto camino en el árbol. 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. Impĺıcitamente se supone que todos los descriptores se refieren a caminos que avanzan en la profundidad del árbol.
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> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> El desciptor //empleado/nombre selecciona la lista de todos los tag nombre que son hijos de un tag empleado en el árbol, partiendo desde cualquier punto. En este caso obtenemos el mismo resultado 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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </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 sólo los nombres de los departamentos. Qué 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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> El descriptor \Empleado\departamento\@telefono selecciona los telefonos de los departamentos de la empresa.
Bases de Datos XPath - XQuery 12 Condiciones de Selección En un descriptor una condición entre paréntesis 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 además cumplen la condición especificada. En las condiciones se pueden usar comparadores (<, >, <=, >=, =,!=) y conectivos lógicos (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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> La expresión /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> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> La expresión //departamento[codigo=b02]/empleado/nombre selecciona los nombre de los empleados del departamento con código B02.
Bases de Datos XPath - XQuery 15 Predicados Las condiciones de selección son un tipo especial de predicados que se usan para dirigir la búsqueda por el árbol. En general un predicado, que también se escribe entre paréntesis cuadrados luego de un elemento (o atributo), puede ser una expresión general para dirigir la búsqueda. Se pueden usar funciones construidas (last, count, etc.) o expresiones matemáticas (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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> La expresión \Empresa\departamento[1]\empleado\rut entrega el rut de los empleados del primer elemento departamento en el documento. Por ejemplo la expresión \Empresa\departamento\empleado[last()]\rut entregaría el rut del último elemento empleado de cada departamento en el árbol, y \Empresa\departamento\empleado[last()-1]\rut el rut del penúltimo elemento empleado en el árbol.
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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> La función count se usa para contar elementos. Por ejemplo la expresión \Empresa\departamento[count(empleado)>1]\codigo entrega el elemento código de todos los departamentos que tienen más de un (elemento) empleado.
Bases de Datos XPath - XQuery 18 Axes Hasta ahora sólo hemos visto descriptores de caminos que bajan por el árbol. En general un camino se puede describir para partir en la raíz del árbol y luego ejecutar una secuencia de pasos para recorrer el árbol y encontrar los nodos que se necesitan. En cada paso se puede seguir una de varias direcciones (axes). La dirección 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 último se ha hecho expĺıcito el deseo de seguir por los hijos de Empresa. El @ es simplemente una abreviación de la dirección 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 Más 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 abreviación de esta dirección). 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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> La expresión \\nombre[nombre = Gonzalez ]\parent::empleado\rut entrega el rut del empleado de nombre Gonzalez. La búsqueda 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 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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> La expresión \\Empresa\descendant::nombre obtendría todos los elementos nombre descendientes del elemento Empresa, en nuestro caso, los nombres de departamentos y empleados. Qué 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 salario="600000"> <rut>12008991</rut> <nombre>chavez</nombre> <departamento telefono="2354928"> <codigo>a03</codigo> <nombre>finanzas</nombre> <empleado salario="1000000"> <rut>881672</rut> <nombre>gonzalez</nombre> </Empresa> La expresión \\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, conversión numérica, fecha y horas, funciones de agregación 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 corazón de todos los estándares más avanzados de XML. XSLT XPath XQuery XPointer XLink
Bases de Datos XPath - XQuery 26 XQuery XQuery es un lenguaje de consulta para consultar documentos XML. Lo más simple es pensar que XQuery es a XML como SQL es a las tablas relacionales. XQuery contiene a XPath toda expresión de consulta en XPath, es también válida (y entrega el mismo resultado) en XQuery. Pero XQuery permite mucho más
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 expĺıcito): doc("empresa.xml")\empresa\departamento\empleado[@salario>500000]\nombre es válido también en XQuery. 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 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 expresión simple en XQuery es: for <variable> in <expresión XPath> where <condicion XPath> return <expresión de salida> El where puede ser omitido si se quieren seleccionar todos los nodos sin restricción. El return puede ser condicional (usando if)y así tener más versatilidad en la salida Además el return puede especificar más que simplemente expresiones XPath, puede mezclar tags XML que también se quieran a la salida.
Bases de Datos XPath - XQuery 30 XQuery Ejemplo En la siguiente expresión 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 función data.
Bases de Datos XPath - XQuery 31 XQuery Ejemplo (cont.) Una expresión XQuery puede también llevar un preambulo lo que nos permite por ejemplo generar páginas 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 págiuna 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 más que acerca de XPath). Aun no es un estandard en la Web, pero ya está siendo muy usado. Una referencia completa se puede encontrar en http://www.w3.org/tr/xquery