查找具有特定文本的所有元素
想象一下以下 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/*)
会回来:
你好