XPath

De eedomus - Documentación

Expresiones

Considerando el siguiente documento XML:

<?xml version="1.0"?>
<raíz>
 <enciclopedia nombre="Wikipedia" site="http://es.wikipedia.org/">
  <artículo nombre="XPath">   
   <autores>
    <autor>
     <nombre>Rodríguez</nom>
    </autor>
    <autor>
     <nombre>López</nom>
    </autor>
   </autores>
  </artículo>
 </enciclopedia>
</raíz>

Tenemos las siguientes expresiones XPath:

Expresión XPath Resultado

/

selecciona un nodo "ficticio" llamado root element, que engloba al conjunto del documento, incluido el doctype

/root

selecciona el nodo vacío dado que no hay ningún elemento "root" (pero sí un elemento "raíz")

//artículo

selecciona todos los elementos "artículo" del documento, estén donde estén

/raíz/enciclopedia

selecciona el único elemento "enciclopedia" ya que en este caso es el único hijo de "raíz" que lleva ese nombre

//artículo[@nombre='XPath']

selecciona todos los elementos "artículo" del documento, estén donde estén, que tengan un atributo "nombre" cuyo valor sea "XPath"


Todas estas expresiones XPath son absolutas (empiezan por "/"), lo que significa que devuelven el mismo resultado sea cual sea el contexto.

Las siguientes expresiones son relativas. Si el contexto corriente es el único elemento "enciclopedia", obtenemos lo siguiente:

Expresión XPath Resultado

artículo

selecciona el elemento "artículo"

raíz

no selecciona nada, dado el contexto

artículo[1]/autores/autor[2]

selecciona el segundo autor (López) del primer artículo

artículo[ count( artículo/autores/autor) >1 ]

selecciona los artículos que tienen como mínimo 2 autores

../raíz

selecciona el elemento "raíz" ya que es el padre del elemento corriente


Pruebe sus expresiones XPath

Puede validar sus expresiones en esta página de prueba.


XPath Operators

Puede alterar los resultados de los nodos XML con operadores XPath. Éstos son algunos ejemplos:

  • Para dividir entre 10 el resultado obtenido:
(/SENSORS/TEMPERATURE/VALUE) div 10
  • Para multiplicar por 100 el resultado obtenido:
(/SENSORS/TEMPERATURE/VALUE) * 100


Las siguientes funciones están soportadas:


Para redondear al número entero inferior:

floor(número)

Para redondear al número entero superior:

ceiling(número)

Para redondear al número más cercano:

round(número)

Para contar el número de nodos que devolverá el XPath:

count(xpath)

Para concatenar 2 cadenas de caracteres:

concat(cadena1, cadena2)

Para quedarse sólo con una parte de una cadena de caracteres

substring(cadena, principio, longitud)
substring(cadena, principio)

Para conservar sólo los datos situados antes de un caracter determinado:

substring=before(cadena1, cadena2)

Para conservar sólo los datos situados después de un caracter determinado:

substring=after(cadena1, cadena2)

Para obtener la longitud de una cadena:

string-length(cadena)

Para sustituir unos caracteres por otros

translate(cadena1, cadena2, cadena3)

Ejemplo: translate('12:30','30','45') Resultado: '12:45'

Ejemplo: translate('12:30','03','54') Resultado: '12:45'

Ejemplo: translate('12:30','0123','abcd') Resultado: 'bc:da'


La función replace() no está soportada, pero puede usar una función específica change(). Puede llamar a la función una o varias veces al final de una expresión XPath para sustituir una cadena por otra:

change(cadena_original, nueva_cadena)


Algunos ejemplos de uso de funciones:

  • Para conservar sólo los datos situados después del '.':
substring-after(/SENSORS/TEMPERATURE/VALUE, '.')
  • Para obtener sólo el segundo caracter leído:
substring(/SENSORS/TEMPERATURE/VALUE, 2, 1)
  • Para contar el número de nodos XML:
count(/SENSORS/TEMPERATURE)
  • Para obtener un nodo esquivando un eventual namespace por defecto:
//*[local-name() = 'VALUE']