xpath
Encontrar elementos que contengan texto específico.
Buscar..
Encuentra todos los elementos con cierto texto.
Imagina el siguiente XML:
<root>
<element>hello</element>
<another>
hello
</another>
<example>Hello, <nested> I am an example </nested>.</example>
</root>
La siguiente expresión XPath:
//*[text() = 'hello']
devolverá el <element>hello</element>
, pero no el elemento <another>
. Esto se debe a que el elemento <another>
contiene espacios en blanco que rodean el texto de hello
.
Para recuperar tanto el <element>
como el <another>
, uno podría usar:
//*[normalize-space(text()) = 'hello']
o
//*[normalize-space() = 'hello']
que recortará el espacio en blanco circundante antes de hacer la comparación. Aquí podemos ver que el especificador de nodo text()
es opcional cuando se utiliza normalize-space
.
Para encontrar un elemento que contiene un texto específico, puede utilizar la contains
la función. La siguiente expresión devolverá el elemento <example>
:
//example[contains(text(), 'Hello')]
Si desea buscar texto que abarque varios nodos hijos / texto, puede usarlo .
en lugar de text()
. .
Se refiere a todo el contenido del texto del elemento y sus hijos.
//example[. = 'Hello, I am an example .']
Para ver los múltiples nodos de texto, puede utilizar:
//example//text()
que volverá:
- "Hola, "
- "Yo soy un ejemplo"
- "."
Y para ver más claramente el contenido de texto completo de un elemento, se puede usar la función de string
:
string(//example[1])
o solo
string(//example)
Hola soy un ejemplo
El último funciona porque, si un conjunto de nodos se pasa a funciones como una string
, XPath 1.0 solo mira el primer nodo (en el orden del documento) en ese conjunto de nodos, e ignora el resto.
asi que:
string(/root/*)
volvería:
Hola