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