xpath
Znajdowanie elementów zawierających określony tekst
Szukaj…
Znajdź wszystkie elementy z określonym tekstem
Wyobraź sobie następujący kod XML:
<root>
<element>hello</element>
<another>
hello
</another>
<example>Hello, <nested> I am an example </nested>.</example>
</root>
Następujące wyrażenie XPath:
//*[text() = 'hello']
zwróci <element>hello</element> , ale nie element <another> . Wynika to z faktu, że element <another> zawiera białe znaki otaczające tekst hello .
Aby pobrać zarówno <element> i <another> , można użyć:
//*[normalize-space(text()) = 'hello']
lub
//*[normalize-space() = 'hello']
co spowoduje przycięcie otaczających białych znaków przed wykonaniem porównania. Tutaj widzimy, że specyfikator węzła text() jest opcjonalny, gdy używa się normalize-space .
Aby znaleźć element zawierający określony tekst, możesz użyć funkcji contains . Poniższe wyrażenie zwróci element <example> :
//example[contains(text(), 'Hello')]
Jeśli chcesz znaleźć tekst obejmujący wiele potomków / węzłów tekstowych, możesz użyć . zamiast text() . . odnosi się do całej zawartości tekstu elementu i jego dzieci.
//example[. = 'Hello, I am an example .']
Aby wyświetlić wiele węzłów tekstowych, możesz użyć:
//example//text()
który zwróci:
- "Witaj, "
- „Jestem przykładem”
- „.”
Aby wyraźniej zobaczyć całą zawartość tekstu elementu, można użyć funkcji string :
string(//example[1])
Lub tylko
string(//example)
Cześć, jestem przykładem.
Ten ostatni działa, ponieważ jeśli zestaw węzłów zostanie przekazany do funkcji takich jak string , XPath 1.0 po prostu spojrzy na pierwszy węzeł (w kolejności dokumentów) w tym zestawie węzłów i zignoruje resztę.
więc:
string(/root/*)
wróciłby:
Witaj