XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf ·...

41
Diego Berrueta 1 XPath XPath Diego Berrueta [email protected]

Transcript of XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf ·...

Page 1: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 1

XPathXPath

Diego [email protected]

Page 2: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 2

ContenidoContenido

▶ Introducción▶Expresiones, rutas, ejes y pasos▶Funciones

▶Ejercicios

Page 3: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 3

Introducción a XPathIntroducción a XPath

▶Recomendación del W3C, desarrollada en paralelo con XSLT⇨Se usa también en XPointer y XLink

▶Objetivo: seleccionar fragmentos de un documento XML

▶Objetivo complementario: definir patrones para las plantillas

▶Sintaxis no-XML▶Opera sobre una estructura abstracta (árbol),

no sobre la sintaxis

Page 4: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 4

Parecidos razonablesParecidos razonables

▶Rutas de directorios▶DOM▶XML Information Set (Infoset)▶Expresiones regulares

Page 5: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 5

Modelo de datos (I)Modelo de datos (I)

▶XPath trabaja con el XML modelado como un árbol

▶Los nodos del árbol pueden ser:⇨Nodo raíz⇨Nodo elemento⇨Nodo texto⇨Nodo atributo⇨Nodo instrucción de procesamiento⇨Nodo comentario

Page 6: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 6

Modelo de datos (II)Modelo de datos (II)

▶Existen dos recorridos del árbol:⇨En el orden del documento (document-order)⇨En el orden inverso (reverse-order)

▶Valor-cadena de distintos nodos:⇨Elementos: concatenación de todos los nodos de

texto descendientes⇨Atributos: valor normalizado⇨Texto: valor literal

Page 7: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 7

Cuestiones sintácticasCuestiones sintácticas

▶Las expresiones XPath suelen ir dentro de atributos XML (p.e.: select, match). Por tanto:⇨Se aplican las normas de codificación de

cadenas de texto (“<” es “&lt;”)⇨Se pueden alternar comillas simples y dobles, o

codificarlas (&quot; y &apos;)

▶Se usan muchas comodidades sintácticas para abreviar las expresiones

Page 8: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 8

Funcionamiento generalFuncionamiento general

▶El componente básico es la expresión▶Una expresión se evalúa respecto a un

contexto...▶ ... para devolver un objeto, cuyo tipo puede

ser:⇨Node-set (conjunto no ordenado de nodos, sin

duplicados)⇨Booleano (true() / false())⇨Número⇨Cadena de texto

Page 9: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 9

Contexto de evaluaciónContexto de evaluación

▶Un nodo de contexto▶La posición en el contexto (entero)▶El tamaño del contexto (entero)

Inmutables:▶Ligaduras de variables (no hay asignación)▶Biblioteca de funciones▶Declaraciones de espacios de nombres

Page 10: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 10

ExpresionesExpresiones

▶Unión de dos node-sets: '|'▶Referencia a una variable ($variable)▶Valor literal (cadena o número)▶Llamada a una función u operador▶Ruta de localización

Page 11: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 11

Rutas de localizaciónRutas de localización

▶Las rutas de localización son las expresiones más importantes

▶Una ruta se compone de varios pasos de localización⇨Los pasos se separan por '/': paso1 / paso2 ...

▶Una ruta puede ser:⇨Relativa: se evalúa desde el nodo de contexto⇨Absoluta (comienza por '/'): se evalúa desde el

nodo raíz

Page 12: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 12

Evaluación de una rutaEvaluación de una ruta

▶Se evalúa de izquierda a derecha▶El paso más a la izquierda se evalúa primero

respecto al contexto actual▶Se genera un nuevo resultado (habitualmente

un node-set)▶Para cada nodo del node-set, se evalúa

recursivamente el resto de la ruta, modificando el contexto, y se concatenan los resultados

Page 13: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 13

Pasos de localizaciónPasos de localización

▶Cada paso se compone de:⇨Un eje⇨Una prueba de nodo⇨Opcionalmente, varios predicados

▶Sintaxis:

eje :: prueba_nodo [pred1] [pred2] ...

Page 14: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 14

Evaluación de un pasoEvaluación de un paso

▶Se construye un node-set con todos los nodos que están relacionados con el nodo de contexto en el eje indicado

▶Se refina el node-set, descartando todos los que no tengan el tipo o nombre indicado

▶Se refina de nuevo el node-set, seleccionando sólo los que verifiquen los predicados

Page 15: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 15

Ejes (I)Ejes (I)

▶child:: Hijos directos (pero no atributos)

▶descendant:: Descendientes

▶ following-sibling:: Hermanos posteriores

▶ following:: Posteriores (excluyendo descendientes)

▶parent:: Padre directo (si existe)

▶ancestor:: Antecesores

▶preceding-sibling:: Hermanos precedentes

▶preceding:: Precedentes (excluyendo antecesores)

Page 16: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 16

Ejes (II)Ejes (II)

▶self:: El nodo de contexto▶ancestor-or-self::▶descendant-or-self::

Ejes de tipo especial (no elementos):▶attribute:: Atributos del nodo de contexto▶namespace:: Espacios de nombres del nodo

de contexto

Page 17: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 17

Abreviaturas de ejesAbreviaturas de ejes

▶child:: es el eje por omisión▶attribute:: se abrevia '@'▶ '.' equivale a “self::node()”▶ '..' equivale a “parent::node()”▶ '//' equivale a “/descendant-or-self::node()/”

Page 18: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 18

Pruebas de nodoPruebas de nodo

▶Nombre cualificado: se verifica para los nodos que tienen ese nombre

▶ '*': se verifica para todos los nodos del tipo del eje (elementos, atributos, NS)

▶node(): se verifica para cualquier tipo de nodo [por tanto, * ⊆ node()]

▶ text(): se verifica para los nodos de tipo texto

▶comment() y processing-instruction(): se verifica para los nodos de esos tipos

Page 19: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 19

PredicadosPredicados

▶Actúan como filtros▶Un predicado puede ser:

⇨Un número: sólo se verifica si coincide con la posición en el contexto. Atención: la numeración comienza en 1, no en 0 (Java, C#)

⇨Una expresión booleana o convertible a booleana (función boolean())

▶El orden es significativo

Page 20: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 20

FuncionesFunciones

▶Conversión de tipos:⇨string(), number() y boolean()

▶Operadores booleanos:⇨and, or, not() [en realidad, not() es una función]

▶Operadores aritméticos:⇨+, -, *, div, mod [un espacio debe preceder a '-']

▶Operadores de comparación:⇨=, !=, <, >, <=, >= [igualdad con =, no ==]

▶Funciones de biblioteca

Page 21: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 21

Funciones de conversión de Funciones de conversión de tipos (I)tipos (I)

▶string()▶number()▶boolean()▶Si el argumento de una función no es del tipo

esperado, se realiza una conversión implícita usando una de estas tres funciones⇨Observación: no hay conversión a node-sets

Page 22: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 22

Funciones de conversión de Funciones de conversión de tipos (II)tipos (II)

▶string(): convierte a cadena de texto⇨Si es un número, se devuelve su representación

como cadena de texto (es mejor utilizar la función format-number)

⇨Si es un booleano, se devuelve “true” o “false”⇨Si es un node-set, se aplica al primer nodo⇨Si es un nodo, se devuelve el valor-cadena

Page 23: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 23

Funciones de conversión de Funciones de conversión de tipos (III)tipos (III)

▶number(): convierte a un número flotante⇨Si es una cadena, trata de parsearla⇨Si es un booleano, true() es 1 y false() es 0⇨Si es un node-set, se convierte primero a cadena

mediante string()

Page 24: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 24

Funciones de conversión de Funciones de conversión de tipos (IV)tipos (IV)

▶boolean(): convierte a un booleano⇨Si es un número, es true() si distinto de cero⇨Si es un node-set, es true() si contiene algún

elemento (muy útil en predicados)⇨Si es una cadena, es true() si no es la cadena

vacía

Page 25: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 25

Funciones de biblioteca (I)Funciones de biblioteca (I)

▶Matemáticas⇨sum()⇨floor()⇨ceiling()⇨round()

Page 26: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 26

Funciones de biblioteca (II)Funciones de biblioteca (II)

▶Manipulación de cadenas:⇨concat()⇨substring()⇨substring-before(), substring-after()⇨translate()⇨normalize-space()⇨string-length() [resultado: entero]

▶Predicados sobre cadenas:⇨contains()⇨starts-with() [pero no hay ends-with()]

Page 27: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 27

Funciones de biblioteca (III)Funciones de biblioteca (III)

▶Relativas al node-set o el contexto:⇨position()⇨last()⇨count(node-set)⇨id() [devuelve un node-set]

▶Propiedades de los nodos:⇨name()⇨local-name()⇨namespace-uri()⇨lang()

Page 28: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 28

Carga de documentos Carga de documentos externosexternos

▶document() permite cargar un documento XML en tiempo de ejecución

▶Esto permite extraer y combinar información de múltiples ficheros

▶Advertencia: suele presentar problemas de rendimiento

Page 29: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 29

XPath como lenguaje de XPath como lenguaje de patronespatrones

▶XSLT reaprovecha XPath como lenguaje para definir los patrones de las plantillas

▶No todas las expresiones XPath pueden ser patrones:⇨Debe devolver un node-set⇨Sólo valen los ejes child:: y attribute:: (y '//')

▶Un nodo “encaja” con el patrón si pertenece al node-set resultante de evaluar la expresión con respecto a algún contexto formado por él mismo o por sus antecesores

Page 30: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 30

EJERCICIOS

Page 31: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 31

Fichero RSS (ej: Barrapunto)Fichero RSS (ej: Barrapunto)

▶Obtener el título del canal▶Obtener el título de la primera noticia▶Contar el número de noticias▶Contar cuántas noticias han sido editadas por

“Yonderboy”▶Contar cuántas noticias tienen más de 50

comentarios▶Sumar los comentarios de todas las noticias▶Contar cuántas noticias fueron editadas el

mismo día que la más reciente

Page 32: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 32

Población provincias (I)Población provincias (I)

▶Contar cuántas provincias hay▶Obtener la población de la provincia más

poblada (están ordenadas de mayor a menor)▶Contar cuántas provincias superan el millón

de habitantes▶Sumar la población de todas las provincias▶Sumar la población de las provincias de

menos de un millón de habitantes▶Sumar la población de las 5 provincias más

pobladas

Page 33: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 33

Población provincias (II)Población provincias (II)

▶Sumar la población de las provincias que ocupen una posición par

▶Provincias que comienzan por 'A'▶Provincias que contienen la letra 'a'

(minúscula)▶Provincias que contienen la letra 'a'

(minúscula o mayúscula)▶Provincias que contienen alguna de estas

letras: 'b, d, g' (sin usar OR)

Page 34: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 34

Población provincias (III)Población provincias (III)

▶Provincias que terminan en 's'▶Provincias que tienen al menos una 'a' y

además tienen al menos una 'e' antes de la primera 'a'

▶Provincias que tienen una 'e' entre sus primeras 4 letras

▶Provincias que van justo después de otra que contiene la letra 'i'

Page 35: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 35

Superficie comunidades (I)Superficie comunidades (I)

▶Superficie de la comunidad más grande⇨Están ordenadas de mayor a menor

▶Calcular la superficie de España⇨PRIMER INTENTO: eliminar las unidades⇨SEGUNDO INTENTO: usar otro fichero

▶Sumar la superficie de las comunidades uniprovinciales

▶Comunidades más grandes que Asturias▶Comunidades uniprovinciales con el mismo

nombre que la provincia

Page 36: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 36

Superficie comunidades (II)Superficie comunidades (II)

▶Comunidades que tienen un número par de provincias

▶Comunidades que tienen más de una palabra en el nombre

▶La segunda comunidad (por población) que tiene más de una palabra en el nombre⇨Atención al orden de los predicados

▶Comunidades cuyas provincias tienen todas una 'a'⇨Sugerencia: probar primero con alguna

Page 37: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 37

Superficie comunidades (III)Superficie comunidades (III)

▶Provincias que son primeras o últimas en sus comunidades⇨Lo mismo, pero sin usar position() ni last()

▶Lo mismo, pero sólo en comunidades con al menos tres provincias

▶Comunidades cuya superficie media por provincia sea al menos de 10.000 km2

Page 38: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 38

Otros ejerciciosOtros ejercicios

▶Redondear un número real con una cantidad fija de decimales

▶Expresión absoluta que selecciona todos los nodos

▶Expresión relativa que selecciona todos los nodos

Page 39: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 39

Limitaciones de XPathLimitaciones de XPath

▶Xpath es demasiado pobre para expresar algunas consultas:⇨Join⇨Map⇨Ordenación de resultados⇨...

▶Sin embargo, la combinación de XPath + XSLT es mucho más potente

▶Algunos procesadores de XPath + XSLT permiten acoplar extensiones

Page 40: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 40

ReferenciasReferencias

▶XML Path Language (XPath) [W3C Recommendation]

▶Página de XPath en la Wikipedia▶XSLT Cookbook [Sal Mangano, O'Reilly]

Page 41: XPath - Departamento de Informáticadi002.edv.uniovi.es/~labra/cursos/XMLAvanzado/XPath.pdf · Opera sobre una estructura abstracta (árbol), no sobre la sintaxis. Diego Berrueta

Diego Berrueta 41

F I N