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