Introducción teórica a XPath

2
44968

Introducción teórica a XPath.

0. Índice de contenidos.

1. Introducción

Esta más que demostrada la gran utilidad que tiene los documentos XML, de hecho, desde su aparición estos documentos han ido
adquiriendo mayor importancia y han sido aplicados en más sitios. Recordar que en muchos casos sirven de contenedores de propiedades
,ficheros configurables de diversas cosas, etc..Seguro que a lo largo de vuestra vida laboral os habéis tenido que enfrentar con uno
de ellos en alguna ocasión.

Antes de meterme de lleno con XPath trararé de dejar claro una serie de conceptos necesarios para aprovechar este tutorial.

XML (eXtensible Markup Language) es un Lenguaje Extensible de Etiquetado cuya función principal es
la de generar documentos de texto con etiquetas, estos documentos contienen esencialmente información y hay
que destacar que no se hace mención en ningún momento a los detalles de presentación.

Ejemplo de documento XML


  
  
    
    
      
    
  

Por otro lado, estos documentos organizan la información de manera jerárquica en función de las etiquetas utilizadas.
Dicha información es comprensible de un «simple» vistazo pero hay que tener en cuenta que estos ficheros serán procesados.

Por lo tanto el procesamiento de un documento XML requiere acceder a cada una de las partes que lo componen,esto nos va a permitir obtener
formas de representación más adecuadas ya que vamos a poder acceder a cada uno de los elementos de forma independiente.

Importante :XML describe los datos pero no se encarga de mostrarlos.

Para poder seleccionar información dentro de un documento XML vamos a hacer uso de XPath, este lenguaje nos va a permitir seleccionar y acceder a
cualquier información contenido en un fichero XML.

2. Qué es XPath?

XPath (XML Path Language) es un lenguaje que permite recuperar información de un documento XML.
Para ello define una sintaxis para establecer partes en un documento XML, permitiendo navegar a través de sus
elementos y atributos, ademá permite manipular de forma básica booleanos, números y cadenas.

En líneas generales se podría decir que se basa en relaciones de «parentesco» entre esos elementos.
Esta parte se verá más en detalle a lo largo del desarrollo de los siguientes apartados.

Utiliza un tipo de notación similar a las rutas de los ficheros, pero haciendo referencia a los nodos de un
XML.

XPath fue creado para su uso con el est´ndar XSTL (es el mayor componente en XSTL).

Estándar XSTL

XSTL (eXtensible Stylesheet Language for Transformations) es un estándar que define la forma de
transformar un documento XML en otro documento XML (DTD Origen -> DTD Destino).Además define también
la forma de transformar un XML para que su salida sea un documento HTML o texto.

Para realizar la transformación se utilizan «hojas XSTL» (vendrían a ser como hojas de estilo)
que se componen de una serie de reglas.El documento XML origen junto con esta serie de reglas son las que utiliza un
procesador de XSTL para generar la salida indicada.

XSTL es por tanto un lenguaje de programación para la transformación de documentos XML en «otros»
documentos, esta definido en XML y es una recomendación de W3C.

La principal utilidad de XPath dentro de este estándar es la examinar y seleccionar la estructura del
documento XML de entrada que se utilizará en la transformación.

Para aquel que quierá ver algún ejemplo práctico integrado con Java se aconseja visitar el siguiente tutorial.

XPath se convirtió en estándar recomendado por la W3C en 1999 (aprobada el mismo día que XSLT).

El objetivo de XPath es la generación de expresiones o mejor dicho, expresiones de trayectorias que navegan por
un documento XML (recordar que este tipo de documentos disponen de uns estructura jerárquica), para ello modela dicho
documento como un árbol de nodos.También incorpora una biblioteca con funciones estándar.

Ayuda : Sería algo similar a seleccionar partes de un texto plano mediante el uso de expresiones regulares.

XPath ha servido de base para el desarrollo de múltiples herramientas para el tratamiento de documentos XML.

  • 1. XLink
  • 2. XPointer
  • 3. XQL

1. XLink

XLink (Lenguaje de Enlace XML) es un lenguaje que permite generar enlaces en los ficheros XML, permitiendo establecer
relaciones cruzadas (enlaces) entre diferentes elementos (2 o más) sin que estos sepan que estan enlazados.

Hay que diferenciar 2 tipos de enlaces:

  • Simples : Son los enlaces de un recurso local a uno remoto.
  • Extendidos : Son los enlaces que permiten vincular muchos recursos entre sí.

También es una recomendación de W3C.

2. XPointer

XPointer (Lenguaje de Direccionamiento XML) es un lenguaje que permite identificar univocamente partes de un documento XML para establecer
vínculos.Lo que hace es establecer un tipo direccionamiento del documento XML en base a su estructura interna (elementos, atributos, etc.).
Entre sus aplicaciones estaría el mostrar partes concretas de un documento XML.

También es una recomendación de W3C.

3. XQL

XQL (Lenguaje de consulta XML) es un lenguaje que permite manejar los documentos XML como si fueran base de datos, es decir, «SQL» para los documentos XML.

3. Terminología en XPath.

Ejemplo de documento XML


  
    
        Fran
        Juan Pablo
        Marta
        Víctor
    
  
  
    
        Tamara
    
  
  
    
        Fer
    
  

Construcción del Árbol de Nodos

Un árbol de nodos se genera tras procesar un documento XML mediante un parser o analizador.

Ejemplo del árbol de nodos referente al ejemplo del comienzo de este apartado:

/
|
+---universidad
      |
      +---carrera
      |     |
      |     +---asignatura
      |           |
      |           +---alumno
      |           |     |
      |           |     +---(texto)Fran
      |           |
      |           +---alumno
      |           |     |
      |           |     +---(texto)Juan Pablo
      |           |
      |           +---alumno
      |           |     |
      |           |     +---(texto)Marta
      |           |
      |           +---alumno
      |                 |
      |                 +---(texto)Víctor
      |
      +---carrera
      |     |
      |     +---asignatura
      |           |
      |           +---alumno
      |                |
      |                +---(texto)Tamara
      |
      +---carrera
            |
            +---asignatura
                  |
                  +---alumno
                       |
                       +---(texto)Fer                                

Este árbol de nodos tiene una estructura básica que es común a todos ellos:

  • Comienza por un elemento raíz.
  • Despliega una serie de elementos intermedios que dependen del elemento raíz.
  • Finaliza en varios elementos finales (también denominados nodos hoja).

Nota : El funcionamiento de XPath se basa en este tipo de representación del documento.

Nodo actual (Current)

Es el nodo que está seleccionado cuando se evalua una expresión XPath, es decir, es el comienzo desde donde
se evalua dicha expresión.

En el ejemplo, si el nodo actual fuera el nodo alumno con texto «Fer» y se buscaran el resto de alumnos, se perderían
los que son anteriores.

Nodo contexto (Context)

Son aquellos nodos que son evaluados de forma parcial, para obtener el resultado de la evalucación de la
expresión XPath.Hay que tener en cuenta que en cada evaluación de las subexpresiones se obtienen un nuevo conjunto
de nodos que pasa a ser el nuevo contexto a evaluar en las siguientes subexpresiones.

Tamaño del contexto

Es el número de nodos que se están evaluando en la expresión XPath en un momento dado.

También se denomina tamaño contextual.

Ojo : Siempre se corresponde con un entero positivo (no nulo).

Posición del contexto

Es la posición que ocupa dentro del documento el nodo contexto.

También se denomina posició contextual.

Ojo :Siempre se corresponde con un entero positivo (no nulo) y es siempre es menor o igual
que el tamaño contextual.

4. Tipos de nodo.

Estos son los diferentes tipo de nodos que podemos distinguir:

Nodo raíz (Root)

Es común a cualquier árbol de nodos.

Se reconoce por su identificador «/».

Es muy importante no confundirlo con el elemento raí del documento. Por lo tanto y aplicado a nuestro ejemplo:

  • Nodo raíz : es el elemento «/» del árbol.
  • Elemento raíz : es el elemento «universidad».

Se puede observar que el elemento raíz esta contenido en el nodo raíz

Nodo elemento (Element)

Cualquier elemento del documento es un nodo elemento del árbol de nodos.

Características:

  • Cada elemento (nodo elemento) tiene un nodo padre.
  • El nodo padre de un elemento es también un elemento excepto el padre de elemento raíz que es el nodo raíz.
  • Cada nodo elemento tiene hijos que pueden ser otros nodos elemento o nodos hoja.
  • Identificador único (Si se acompaña de un DTD que especifique dicho atributo).
  • Disponen de propiedades (nombre/atributos/etc.)

En nuestro ejemplo, si seleccionamos el elemento «asignatura»

  • Nodo padre : «carrera».
  • Nodo/s hijo/s: los 6 nodos elemento «alumnos».

Nodo atributo (Attribute)

Es un tipo especial de nodo.

Características:

  • Un nodo no tienen un número determinado de atributos.
  • Atributo: es una etiqueta incorporada al elemento que lo contiene. (Se compone de un nombre y un valor (Formato cadena).
  • Los atributos pueden tener valores por defecto si se expecifican en el DTD.

Ejemplo de documento XML con atributos para diferenciar las carreras en función del atributo «nombre»


  
    
        Fran
        Juan Pablo
        Marta
        Víctor
    
  
  
    
        Tamara
    
  
  
    
        Fer
    
  

Nodo texto (Text)

Un nodo texto es un nodo de los considerados como hoja.

Características:

  • Referencia a todos los caracteres que no están delimitados por etiquetas.
  • No tiene hijos (el texto que lo compone no se condidera hijos suyos).

En nuestro ejemplo, los nodos texto serían los delimitados por la etiqueta «alumno»

  • Nodo texto 1 :El nodo que contiene el texto «Fran»
  • Nodo texto 2 :El nodo que contiene el texto «Juan Pablo»
  • Nodo texto 3 :El nodo que contiene el texto «Marta»
  • Nodo texto 4 :El nodo que contiene el texto «Víctor»
  • Nodo texto 5 :El nodo que contiene el texto «Tamara»
  • Nodo texto 6 :El nodo que contiene el texto «Fer»

Nodo comentario (Comment)

Se puede acceder con la propiedad «string-value».

Nodo tipo instrucción de procesamiento (processing instruction)

Se puede acceder con la propiedad «string-value».

Relaciones entre nodos

  • Padre : Cada elemento y atributo tiene un padre.
  • Hijo : Los nodos elemento pueden tener cero, uno o más hijos.
  • Hermanos : Los nodos que tienen el mismo padre.
  • Ancestros : Un nodo padre , el padre de ese nodo, etc.
  • Descendientes : Uno nodo hijo, los nodos hijo de ese nodo, etc.

5. Expresiones XPath.

En XPath una expresión es el elemento base que se utiliza para producir un resultado.

Estableciendo una similitud con cualquier lenguaje de programación, una expresión vendría a ser una
instrucción (recordar que XPath es un lenguaje declarativo).

Mediante las expresiones se van a poder seleccionar nodos o conjuntos de nodos.

Al evaluar una o varias expresiones se genera un resultado, este resultado podrá ser de uno de los
siguientes tipos:

  • Conjunto de nodos (Node-set) : Un conjunto de nodos (Nota :sin duplicados y sin orden).
  • Cadena : Un conjunto de caracteres.
  • Número : Punto flotante.
  • Booleano : Verdadero / Falso.

Conjunto de nodos (Node-set)

Los node-set son como se ha dicho antes, conjuntos de nodos no ordenados que se generan como
el resultado de evaluar una expresión XPath.Estos nodos pueden ser de cualquiera
de las tipologías anteriormente descritas, pero suelen corresponderse con los tipos :
elemento,atributo y texto.

Importante :Los elementos que componen un node-set son siempre hermanos con independencia de lo que
fueran antes de la ejecución de la expresión XPath.

Sus hijos originales no están incluidos, pero se puede acceder a ellos.

Para poder evaluar una o varias expresiones también se tiene en cuenta el «contexto», es decir, se tienen en cuenta:

  • Nodo contextual.
  • Posición contextual.
  • Tamaño contextual
  • Asignación de variables
  • Biblioteca de funciones
  • Declaraciones de espacios de nombres aplicables a la expresión

Una expresión XPath genera como resultado una lista de referencias (vacia / un nodo / varios nodos) a los elementos que
encajan en el patrón buscado.

Importante : NO devuelve la lista con los elementos.

6. Localización (Location Path).

Una ruta de localización (location path) es uno de los tipos de expresiones más importantes que se
pueden especificar en XPath, el resultado generado siempre es un node-set.

Importante : Se devuelven los nodos considerados, no los hijos de los nodos.

Su sintaxis es muy similar a la usada para describir la ruta de los ficheros en Linux o Unix.También se
pueden indicar que serían similares a las rutas de Windows y MS-DOS sin consideramos 2 excepciones:

  • Omitir la unidad de disco. Por ejemplo : «C:».
  • Modificar las barras «\» por barras «/».

Hay que hacer notar que sólo se parecen en sintaxis ya que el significado de las expresiones varía mucho
de un caso a otro. Mirar los ejemplos:

– Ejemplo de path en Unix:

/usr/home/carrera/asignatura

Explicación :Hace referencia al directorio «asignatura» que se encuentre en «/usr/home/carrera»

– Ejemplo de expresión en XPath:

/universidad/carrera/asignatura

Explicación :Hace referencia a todos los elementos «asignatura» que dependen de cualquier elemento «carrera» que a su vez
dependan de cualquier elemento «universidad».

Por lo tanto XPath indica la ruta a varios nodos en base a la estructura del documento XML.

Relación con el nodo contextual

Una ruta de localización (location path) tiene un nodo contextual.

La ruta de localización siempre comenzará a aplicarse desde el nodo contextual a menos que se indique lo contrario
estableciendo una ruta explícita.

Tipología de rutas de localización:

  • Absolutas : Comienzan por «/», lo que significa que se aplicará desde el nodo raíz.
  • Relativas : Comienzan desde el nodo contextual (no parte del nodo raíz). El nodo contextual cambia con cada «/», que actua de separador entre
    los pasos de localización -> En cada paso se selecciona un nuevo node-set que pasa a ser el nuevo nodo contextual.
  • Patrones : Obligan al uso de los ejes «child» y attribute.

7. Pasos de localización.

Paso de localización es el nombre con el que se denomina a cada cambio que se produce en una ruta de
localización. Es decir, a cada cambio de «/» que se produce.

Un paso de localización se compone de:

  • Eje (Axis) : Es la relación entre el nodo contextual y el paso.
  • Nodo prueba (Node test) : Es el elemento filtrado (En el caso de rutas de directorios sería el nombre del directorio).
  • Predicado (Predicate) : Expresión XPath entre corchetes.

El Eje a veces está implícito.

El nodo prueba se suele identificar por el nombre, aunque poniendo «*» simboliza cualquier nombre.

El predicado es opcional.

Por lo tanto la sintaxis de un paso de localización sería:

Eje::NodoPrueba[Predicado]

Selección de nodos

En este apartado se pretende mostrar las diferentes formas (pasos de localización) con las que se pueden seleccionar los nodos.

Sintaxis Descripción
/ Selecciona desde el nodo raíz.
// Selecciona nodos desde el nodo contextual (Sin importar donde se encuentren).
. Selecciona el nodo contextual.
.. Selecciona el padre del nodo contextual.
nombre Selecciona los nodos hijos de nodo nombrado.
@prueba Selecciona todos los atributos «prueba».

Estas serían las formas de poder seleccionar nodos que no se conocen.

Sintaxis Descripción
//* Selecciona todos los nodos del documento.
node() Selecciona todos los nodos del documento.
* Selecciona todos los nodos elemento.
@* Selecciona todos los nodos atributos.
/<NodoEjemplo>/* Selecciona todos los los nodos hijos del nodo ejemplo.
//<NodoEjemplo>[@*] Selecciona todos los atributos del nodo ejemplo .

Operadores

Estos son los operadores que se permiten utilizar en las expresiones XPath.

Operador Descripción
| Unión entre 2 node-sets
+ Suma
Resta
* Multiplicación
div División
= Igualdad
!= Diferencia
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
or Disyunción
and Conjunción
mod Módulo (resto)

8. Predicados.

Un predicado es una «condición» que permiten seleccionar un nodo con unos determinados
atributos o características.Como se ha visto en puntos anteriores incorpora un tipo
de verificación durante el paso de localización.

Su sintaxis viene dada entre corchetes ([predicado]) y tiene un valor booleano.

Ejemplo de predicado:

/universidad/carrera/asignatura[@nombre=»Base de datos»]/alumno

Hace referencia a todos los alumnos que pertecen a las asignaturas que tiene como
atributo nombre «Base de datos».

En el apartado anterior se dijo que los predicados son opciones y que en caso de existir
se representan entre corchetes. Entre los corchetes se pueden colocar

Elemento corchete Descripción
Número Selecciona el elemento cuya aparición es la indicada en el número.
Función Selecciona el elemento cuya aparición es el resultado de ejecutar la función. Por ejemplo: last()
Condición position() Selecciona la cantidad de elementos seleccionada en la condición . Por ejemplo position()<6 (Selecciona 5 elementos)
Condición Selecciona los elementos que cumplen la condición.Por ejemplo: dinero<1000
@atributo=’XXXX’ Selecciona los elementos cuyo atributo coincide en valor.Por ejemplo: nombre=’Esther’

9. Ejes.

Un eje se define como la relación existente entre un paso de localización y su nodo contextual.
También se puede definir como un conjunto de nodos relativos al nodo contextual.

Recordar la sintaxis de un paso de localización:

Eje::NodoPrueba[Predicado]

Como se puede observar

  • El eje y el nodo de prueba se encuentran separados por el elemento «::».
  • Se puede traducir por : NodoPrueba[Predicado] «que es un » Eje.

Estos son los ejes que se pueden utilizar

Sintaxis Descripción Caso Especial Resultado
ancestor Selecciona todos los ancestros del nodo contextual. /ancestor::node()/parent::node() /
ancestor-or-self Selecciona todos los ancestros del nodo contextual y el mismo.
attribute Selecciona todos los atributos del nodo contextual.
child Selecciona todos los hijos del nodo contextual.(Suele estar implicito) child::nombreNodo nombreNodo
descendant Selecciona todos los descendientes del nodo contextual. /descendant-or-self::node()/ //
descendant-or-self Selecciona todos los descendientes del nodo contextual y el mismo.
following Selecciona todo el documento que se encuentra a partir del nodo contextual.
following-sibling Selecciona todos los hermanos posteriores del nodo contextual.
namespace Selecciona todos los nodos con el namespace del nodo contextual.
parent Selecciona el nodo padre del nodo contextual. parent::node() ..
preceding Selecciona todo en el documento que esta antes del nodo actual.
preceding-sibling Selecciona todos los hermanos anteriores al nodo actual.
self Selecciona el nodo actual. (Esta implícito para el nodo raíz) self::node() .

Ejemplo de expresión XPath:

/universidad/carrera

Ejemplo de equivalencia con ejes:

/self::universidad/child::carrera

10. Funciones.

En XPath esta permitido el uso de funciones que nos van a facilitar poder realizar algunas
operaciones necesarias de una manera sencilla.

Podemos encontar una amplia variedad de funciones como por ejemplo:

  • boolean() : Convierte a booleano. Al aplicarlo sobre un conjunto de nodos devuelve true si esta vacio.
  • position() : Devuelve la posición de un nodo en su contexto
  • last() : Devuelve la ultima posición
  • count : Devuelve el nº de nodos e un conjunto de nodos.
  • not() : Devuelve el contrario de un booleano dado.

Nota : Existen más funciones de las que aquí se presentan.

11. Integración con: Selenium y Consola Firebug.

Este punto es muy importante porque vamos a relacionar XPath con el paquete de herramientas Selenium y con el plugin Firebug.

Firebug

Si se desconoce esta herramienta se aconseja visitar el siguiente tutorial.

Para aquel que ya sepa un poco de que va Firebug, recordar que podremos ser capaces de extraer la expresión XPath de un elemento inspeccionado. De esta forma podremos
utilizarla para identificar los elementos en el paquete Selenium, pero con una condición, las expresiones que se obtiene por defecto no son todo lo claras que deberían de
ser.

Ejemplo de expresión por defecto extraida desde Firebug :

/html/body/div[3]/div[5]/div[2]/table/tbody/tr/td/div/div/h1/a

Ejemplo de la anterior expresión adaptada :

//a[@ href=»detalle-noticia.php?noticia=96″]

Como se puede comprobar en el ejemplo, el segundo caso es mucho más claro y esta más simplificado. En la mayoría de los casos tendréis que adaptar la expresión a
las necesidades.

Importante :Intentar incorporar identificadores en todos los elementos para que sea más sencillos localizarlos con XPath.

Aún así, otra posible aplicación sería la de poder utilizar expresiones XPath en la consola de Firebug, de esta
forma seremos capaces de encontrar diferentes elementos de la página web. Para ello se utiliza el siguiente comando:

$x(«expresion XPath»)

Por ejemplo :

$x(«//a») Devolvería todos los links dentro de una página

Paquete Selenium

El paquete Selenium es un conjunto de herramientas que nos van a permitir realizar pruebas sobre aplicaciones web. Para más información visitar los
siguientes tutoriales:

XPath es una de las formas que nos va a permitir localizar elementos en un script realizado por Selenium, de hecho, es considerado un sistema de
localización de elementos válido. De esta manera, vamos a poder identificar elementos de una forma más «completa» mediante una de sus expresiones.

Una vez realizado un script con la aplicación Selenium IDE, podemos modificar los localizadores de los elementos, para ello utilizaremos Firebug con el
cual inspeccionaremos el elemento y realizaremos una expresión a partir de uno de sus atributos que a poder ser sea único (por ejemplo id).Para comprobar
la validez denuestra nueva expresión la sustituiremos por el localizador anterior y pulsaremos el botón FIND en la tabla habilitada por Selenium IDE, en
caso de ser correcta nuestra expresión se iluminará mediante un recuadro verde el elemento seleccionado.

12. Conclusiones.

En resumen, XPath es un lenguaje de «ayuda» para localizar elementos dentro de cualquier fichero XML, como véis tiene muchas utilidades pero seguro que
vosotros sois capaces de sacarles muchas más. Tenerlo muy en cuenta cuando uséis el paquete Selenium ya que os falicitará en gran medida el trabajo y sobre
todo permitirá que no se produzcan errores en los scripts cuando estos se basan en la posición de los elementos.

Ojo: No me voy a cansar de repetir que los elementos HTML que utiliceis usen identificadores únicos, que luego pasa lo que pasa….

Considero que no esta demás saber utilizar XPath porque uno nunca sabe cuando lo va a tener que utilizar ;-).

Un saludo.

Víctor

mailto:vjmadrid@autentia.com

2 COMENTARIOS

  1. Hola,

    Tengo una pregunta, Me he releído el post pero no encuentro una utilidad que me estoy buscando,

    ¿Seria posible juntar dos extracciones de html en una misma celda? y tres partes o más ? y cada una de esas partes se podrían separar con una coma?

    estoy intentando obtener ese resultado pero no encuentro la forma

  2. buenas tardes,

    Quería un código xpatch para cada vez que se encuentre «div[contains(@class,»list-games-odds-mobile-top»)]» suba un nivel y me indique «div[contains(@class,»block-title-comparator»)]//span[3]» correspondiente. Tengo formulado «//div[contains(@class,»list-games-odds-mobile-top»)]../../div[contains(@class,»block-title-comparator»)]//span[3]» pero no me carga. La url es «https://www.sportytrader.es/cuotas/futbol/».

    Gracias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad