xpath
Поиск элементов, содержащих конкретный текст
Поиск…
Найти все элементы с определенным текстом
Представьте следующий XML:
<root>
<element>hello</element>
<another>
hello
</another>
<example>Hello, <nested> I am an example </nested>.</example>
</root>
Следующее выражение XPath:
//*[text() = 'hello']
вернет <element>hello</element>
, но не элемент <another>
. Это связано с тем, что элемент <another>
содержит пробелы, окружающие hello
текст.
Чтобы получить как <element>
и <another>
, можно использовать:
//*[normalize-space(text()) = 'hello']
или же
//*[normalize-space() = 'hello']
который будет обрезать окружающие пробелы перед выполнением сравнения. Здесь мы видим, что спецификатор узла text()
является необязательным при использовании normalize-space
.
Чтобы найти элемент, содержащий конкретный текст, вы можете использовать функцию contains
. Следующее выражение вернет элемент <example>
:
//example[contains(text(), 'Hello')]
Если вы хотите найти текст, охватывающий несколько дочерних / текстовых узлов, то вы можете использовать .
вместо text()
. .
относится ко всему текстовому содержимому элемента и его дочерним элементам.
//example[. = 'Hello, I am an example .']
Чтобы увидеть несколько текстовых узлов, вы можете использовать:
//example//text()
который вернется:
- "Привет, "
- «Я - пример»
- ""
И чтобы более четко увидеть весь текстовый контент элемента, можно использовать string
функцию:
string(//example[1])
или просто
string(//example)
Привет, я пример.
Последнее работает, потому что, если набор узлов передается в такие функции, как string
, XPath 1.0 просто смотрит на первый узел (в порядке документа) в этом наборе узлов и игнорирует остальные.
так:
string(/root/*)
вернется:
Привет