Xpath使用简介
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
因此,对 XPath 的理解是很多高级 XML 应用的基础。
下面的示例显示一些基本的 XPath 表达式。通过将这些简单的表达式组合在一起,并使用各种 XPath 运算符和特殊字符,可以生成更复杂的表达式。
-
当前上下文
-
以句点和正斜杠 (./) 作为前缀的表达式明确使用当前上下文作为上下文。例如,以下表达式引用当前上下文中的所有 <author> 元素:
./author
注意,此表达式等效于以下表达式:
-
文档根
-
以正斜杠 (/) 为前缀的表达式使用文档树的根作为上下文。例如,以下表达式引用此文档根的 <bookstore> 元素:
/bookstore
-
根元素
-
使用正斜杠后接星号 (/*) 的表达式将使用根元素作为上下文。例如,以下表达式查找文档的根元素:
复制代码/*
-
递归下降
-
使用双正斜杠 (//) 的表达式指示可以包括零个或多个层次结构级别的搜索。如果此运算符出现在模式的开头,上下文相对于文档的根。例如,以下表达式引用当前文档中任意位置的所有 <author> 元素:
复制代码//author
.// 前缀指示上下文从层次结构中当前上下文所指示的级别开始。
-
特定元素
-
以元素名开头的表达式引用特定元素的查询,从当前上下文节点开始。例如,以下表达式引用当前上下文节点中 <images> 元素内的 <background.jpg> 元素:
images/background.jpg
以下表达式引用当前上下文节点中 <bookstore> 元素内的 <book> 元素的集合:
以下表达式引用当前上下文节点中的所有 <first.name> 元素:
注意
元素名可以包括句点字符 (.)。这些名称的用法与任何其他名称一样。
运算符和特殊字符
XPath 表达式是使用下表中所示的运算符和特殊字符构造的。
/ | 子运算符;选择左侧集合的直接子级。此路径运算符出现在模式开头时,表示应从根节点选择该子级。 |
// | 递归下降;在任意深度搜索指定元素。此路径运算符出现在模式开头时,表示应从根节点递归下降。 |
. | 指示当前上下文。 |
.. | 当前上下文节点的父级。 |
* | 通配符;选择所有元素,与元素名无关。 |
@ | 属性;属性名的前缀。 |
@* | 属性通配符;选择所有属性,与名称无关。 |
: | 命名空间分隔符;将命名空间前缀与元素名或属性名分隔。 |
( ) | 为运算分组,明确设置优先级。 |
[ ] | 应用筛选模式。 |
[ ] | 下标运算符;用于在集合中编制索引。 |
+ | 执行加法。 |
- | 执行减法。 |
div | 根据 IEEE 754 执行浮点除法。 |
* | 执行乘法。 |
mod | 从截断除法返回余数。 |
此表不包括布尔运算符和集运算符,这两个运算符在布尔、比较和集表达式或集运算中列出。
优先级顺序(从最高优先级到最低优先级)的定义如下表所示。
优先级 | 字符 | 用途 |
---|---|---|
1 | ( ) | 分组 |
2 | [ ] | 筛选器 |
3 | / // | 路径运算 |
分组运算符 () 仅适用于顶级路径表达式。例如,(//author/degree | //author/name) 是有效的分组运算,但 //author/(degree | name) 不是。
筛选模式运算符 ([]) 的优先级高于路径运算符(/ 和 //)。例如,表达式 //comment()[3] 选择相对于文档中任意位置备注的父级索引等于 3 的所有备注。此表达式与表达式 (//comment())[3] 不同,后者选择相对于父级的所有备注集中的第三个备注。前一个表达式可以返回多个备注,后一个表达式只能返回一个备注。
这些运算符和特殊字符在本参考文档中详细说明。
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
特定类型的元素集合可以使用路径运算符(/ 和 //)确定。这些运算符根据其参数的“左侧”集合进行选择,“右侧”集合表示要选择的元素。子运算符 (/) 从左侧集合的直接子级中选择,而子代运算符 (//) 从左侧集合的任意子代中选择。因此,// 可以作为一个或多个层次级别的替代。
注意,路径运算符在执行查询时更改上下文。通过将路径运算符连接在一起,用户可以遍历文档树。
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
表达式 | 引用 |
---|---|
author/first-name | 当前上下文节点的 <author> 元素中的所有 <first-name> 元素。 |
bookstore//title | <bookstore> 元素中更深的一级或多级(任意子代)的所有 <title> 元素。注意,此表达式与以下模式 bookstore/*/title 不同。 |
bookstore/*/title | 属于 <bookstore> 元素的孙级的所有 <title> 元素。 |
bookstore//book/excerpt//emph | <book> 元素的 <excerpt> 子级中的任意位置和 <bookstore> 元素中的任意位置的所有 <emph> 元素: |
.//title | 当前上下文中更深的一级或多级的所有 <title> 元素。注意,本质上只有这种情况需要句点表示法。 |
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
通过使用通配符 (*) 集合,不使用元素名即可引用元素。* 集合引用作为当前上下文的子级的所有元素,与名称无关。
示例
表达式 | 引用 |
---|---|
author/* | <author> 元素的所有元素子级。 |
book/*/last-name | 所有作为 <book> 元素的孙级的 <last–name> 元素。 |
*/* | 当前上下文的所有孙级元素。 |
my:book | my 命名空间中的 <book> 元素。 |
my:* | my 命名空间中的所有元素。 |
注意,不支持模式 *:book。
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
使用 @* 可以返回某个元素的所有属性。对于将属性作为记录中的字段的应用程序,此表达式可能非常有用。
示例
表达式 | 引用 |
---|---|
@* | 当前上下文节点的所有属性。 |
@my:* | my 命名空间中的所有属性。不包括 my 命名空间中的元素的未限定属性。 |
注意,不支持模式 @*:title。
XPath 查询返回的集合在定义的范围内保留文档顺序、层次结构和标识。也就是说,按照文档顺序返回元素集合,没有重复的元素。因为根据定义,属性不排序,所以,为特定元素返回的属性不进行明确地排序。
具有特定标记名的所有元素的集合使用标记名本身表示。限定方法可以通过使用句点和正斜杠 (./) 表明元素是从当前上下文中选择,但是默认情况下将使用当前上下文,不必明确说明。
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
使用 XPath 表达式可以很容易在节点集中查询特定的节点。只需为索引序号加上方括号。序号从 1 开始(第一个元素是编号 1)。
方括号字符 ([]) 的优先级高于斜杠字符(/ 和 //)。有关更多信息,请参见运算符和特殊字符。
示例
表达式 | 引用 |
---|---|
author[1] | 第一个 <author> 元素。 |
author[first-name][3] | 具有 <first-name> 子元素的第三个 <author> 元素。 |
注意,索引相对于筛选的节点集。例如,请考虑以下数据。
下表显示如何选择特定的 <x> 和 <y> 元素。
表达式 | 引用 |
---|---|
x/y[1] | 每个 <x> 中的第一个 <y>。 |
(x/y)[1] | <x> 元素中整个 <y> 元素集的第一个 <y>。 |
x[1]/y[1] | 第一个 <x> 中的第一个 <y>。 |
上面的示例简单地引用使用暗示默认值(例如 child:: 轴)的 XPath 集合。对于此轴,子节点集合按照前向文档顺序编制索引。
对于其他轴(例如 ancestor::),在 XPath 表达式中明确使用轴名。对于此轴,上级集合按照后向文档顺序编制索引。从上表中考虑此示例:
x/y[1]
此表达式等效于以下表达式:
x/child::y[1]
两个表达式均意味着“对每个 <x> 元素选择第一个名为 <y> 的子元素”。
下面的示例使用了相同的语法。
x/ancestor::y[1]
此示例意味着“对每个 <x> 元素选择第一个名为 <y> 的祖先元素(按照后向文档顺序)”。语法相同但是顺序相反。
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
last() 函数对集合中的最后一个元素返回 True。注意,last 相对于父节点。
示例
表达式 | 引用 |
---|---|
book[last()] | 最后一个 <book> 元素。 |
book/author[last()] | 每个 <book> 元素中的最后一个 <author> 元素。 |
(book/author)[last()] | <book> 元素中整个 <author> 元素集的最后一个 <author> 元素。 |
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
为了清楚起见,或正常的优先级不足以表达某个运算,可以使用括号为集合运算符分组。分组运算符可以在任何筛选表达式(谓词)中使用,例如 author[(degree or award)and publication]。也可以在顶级步长表达式中使用,例如 (book|magazine) 或 (author/degree | book/award)。不能应用于低级步长表达式。例如,author/(degree | award)无效。
示例
表达式 | 引用 |
---|---|
(book/author) | 属于当前上下文节点中任何 <book> 元素的子元素的所有 <author> 元素。 |
author[(degree or award) and publication] | 至少包含一个 <degree> 或 <award> 元素以及至少包含一个 <publication> 元素的所有 <author> 元素。 |
通过将筛选子句 [pattern] 添加到集合中,可以对任何集合应用约束和分支。筛选器类似于 SQL WHERE 子句。筛选器中包含的模式称为“筛选模式”。筛选模式计算为布尔值,对集合中的每个元素进行测试。集合中所有未通过筛选模式测试的元素将从结果集合中省略。
为了方便起见,如果集合在筛选器内,若集合包含任何成员,则生成布尔值 TRUE,若集合为空,则生成 FALSE。author/degree 之类的表达式意味着,如果存在包含名为 <degree> 的子元素的 <author> 元素,集合到布尔值的转换函数将计算为 TRUE。
注意,在表达式的给定级别可以出现任意数目的筛选器。不允许使用空筛选器。
筛选器总是针对上下文进行计算。也就是说,表达式 book[author] 意味着,对每个找到的 <book> 元素测试是否包含 <author> 子元素。同样,book[author = 'Bob'] 意味着,对每个找到的 <book> 元素测试是否包含值为 Bob 的 <author> 子元素。还可以使用句点 (.) 字符检查上下文的值。例如,book[. = 'Trenton'] 意味着,对当前上下文中找到的每一本书,测试值是否为 Trenton。
![](http://i.msdn.microsoft.com/Global/Images/clear.gif)
表达式 | 引用 |
---|---|
book[excerpt] | 至少包含一个 <excerpt> 元素的所有 <book> 元素。 |
book[excerpt]/title | 至少包含一个 <excerpt> 元素的 <book> 元素内的所有 <title> 元素。 |
book[excerpt]/author[degree] | 至少包含一个 <degree> 元素并且在至少包含一个 <excerpt> 元素的 <book> 元素内的所有 <author> 元素。 |
book[author/degree] | 至少包含一个 <author> 元素并且该元素至少包含一个 <degree> 子元素的 <book> 所有元素。 |
book[excerpt][title] | 至少包含一个 <excerpt> 元素以及至少包含一个 <title> 元素的 <book> 所有元素。 |
筛选模式可以包含布尔表达式、比较表达式和集表达式。下表中列出的快捷方式表示此 XSL 转换 (XSLT) 实现中提供的备选符号。本文档讨论这些表达式运算符。
运算符 | 说明 |
---|---|
and | 逻辑与 |
or | 逻辑或 |
not() | 非 |
= | 相等 |
!= | 不相等 |
< * | 小于 |
<= * | 小于或等于 |
> * | 大于 |
<= * | 大于或等于 |
| | 集运算;返回两个节点集的联合 |
* 扩展的 XPath 方法
万维网联合会 (W3C) 的运算符关键字语法使用空白和其他分隔符,不使用版本 2.5 中使用的美元字符 ($)。在 W3C 语法中,$xxx$ 格式的二进制关键字可以表示为 wsxxxws,其中 ws 是指标记终止符,可以是空白、单引号 (') 或双引号 (")。not() 等一元运算符使用函数表示法。尽管 Microsoft 实现支持这两种语法,但是,为了以后的兼容性,建议使用 W3C 语法。
比较运算符和布尔运算符的优先级顺序(从最高优先级到最低优先级)如下表所示。
1 | ( ) | 分组 |
2 | [ ] | 筛选 |
3 | / // | 路径运算 |
4 | < 或者 < <= 或者 <= > 或者 > >= 或者 >= | 比较 |
5 | = != | 比较 |
6 | | | 联合 |
7 | not() | 布尔值非 |
8 | And | 布尔值与 |
9 | Or | 布尔值或 |
在 XML 文档(例如 XSLT 样式表)中使用运算符时,< 和 > 标记必须分别转义为 < 和 >。例如,以下 XSLT 指令在所有 <price> 元素的数值小于或等于 10 的 <book> 元素上调用 XSLT 模板规则。
XPath 表达式与 DOM 一起使用时,< 和 > 运算符不需要转义。例如,以下 JScript 语句选择所有 <price> 元素的数值小于或等于 10 的 <book> 元素。
布尔表达式可以匹配特定值的所有节点或包含特定范围的节点的所有节点。以下是返回 false 的布尔表达式的示例
1 >= 2
运算符区分大小写。
逻辑与和逻辑或
布尔运算符 and 和 or 分别执行逻辑与和逻辑或运算。这些运算符与分组括号组合使用时,可以用于构建复杂的逻辑表达式。
示例
表达式 | 引用 |
---|---|
author[degree and award] | 至少包含一个 <degree> 元素以及至少包含一个 <award> 元素的所有 <author> 元素。 |
author[(degree or award) and publication] | 至少包含一个 <degree> 或 <award> 元素以及至少包含一个 <publication> 元素的所有 <author> 元素。 |
布尔值非
not 布尔运算符在筛选模式中对表达式的值求非。
示例
表达式 | 引用 |
---|---|
author[degree and not(publication)] | 至少包含一个 <degree> 元素但是不包含 <publication> 元素的所有 <author> 元素 |
author[not(degree or award) and publication] | 至少包含一个 <publication> 元素但是不包含任何 <degree> 元素或 <award> 元素的所有 <author> 元素。 |
示例
XML 文件 (test.xml)
<?xml version="1.0"?> <test> <x a="1"> <x a="2" b="B"> <x> <y>y31</y> <y>y32</y> </x> </x> </x> <x a="2"> <y>y2</y> </x> <x a="3"> <y>y3</y> </x> </test>