xpath
Trovare elementi contenenti testo specifico
Ricerca…
Trova tutti gli elementi con un determinato testo
Immagina il seguente XML:
<root>
<element>hello</element>
<another>
hello
</another>
<example>Hello, <nested> I am an example </nested>.</example>
</root>
La seguente espressione XPath:
//*[text() = 'hello']
restituirà l' <element>hello</element>
, ma non l'elemento <another>
. Questo perché l'elemento <another>
contiene spazi bianchi che circondano il testo hello
.
Per recuperare sia <element>
che <another>
, si potrebbe usare:
//*[normalize-space(text()) = 'hello']
o
//*[normalize-space() = 'hello']
che taglierà lo spazio circostante circostante prima di fare il confronto. Qui possiamo vedere che lo specificatore del nodo text()
è opzionale quando si usa lo normalize-space
.
Per trovare un elemento contenente testo specifico, puoi utilizzare la funzione contains
. La seguente espressione restituirà l'elemento <example>
:
//example[contains(text(), 'Hello')]
Se vuoi trovare un testo che si estende su più bambini / nodi di testo, puoi utilizzarlo .
invece di text()
. .
si riferisce all'intero contenuto testuale dell'elemento ed è figlio.
//example[. = 'Hello, I am an example .']
Per vedere i diversi nodi di testo, puoi usare:
//example//text()
che restituirà:
- "Ciao, "
- "Sono un esempio"
- ""
E per vedere più chiaramente l'intero contenuto del testo di un elemento, si può usare la funzione string
:
string(//example[1])
o semplicemente
string(//example)
Ciao, sono un esempio.
Quest'ultimo funziona perché, se un set di nodi viene passato in funzioni come string
, XPath 1.0 guarda solo il primo nodo (nell'ordine del documento) in quel set di nodi e ignora il resto.
così:
string(/root/*)
ritornerebbe:
Ciao