(首发于 2018 年 8 月 5 日)
XPath 是一门在 XML 文档中查找信息的语言,用于在 XML 文档中通过元素和属性进行导航。XPath 虽然被设计用来搜索 XML 文档,不过它也能很好地在 HTML 文档中工作,大部分浏览器都支持通过 XPath 来查询节点。XPath 叫做 path,说明它是以路径表达式的形式来搜索元素的,这种路径表达式与我们计算机系统上的文件系统路径表达很类似。接下来,我从节点、语法、轴和运算符这四个部分来学习 XPath 在 XML 文档中的使用。
1. XPath 节点
在 XPath 中,XML 文档是被看作节点树,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释和文档(根)节点。
在 XML 文档中,XPath 表示各节点的关系有:父 (Parent)、子 (Children)、同胞 (Sibling)、先辈 (Ancestor)、后代 (Descendant)。
2. XPath 语法
2.1 路径表达式
XPath 使用路径表达式来选取 XML 文档中的节点或节点集,节点是沿着路径 (path) 或者步 (steps) 来选取的。路径表达式语法规则如下表所示。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 选择任意位置的某个节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
路径表达式中绝对路径、相对路径和步的概念如下所示。
- 绝对路径起始于正斜杠 (/)。
- 相对路径可以起始于任何节点。
- 步包括轴、节点测试、零个或多个谓语,用来更深入地选取节点集,语法为:轴名称::节点测试[谓语]
2.2 谓语
路径表达式的实现效果是选取所有符合条件的节点,XPath 还能选取某个特定的节点或者包含一个特定值的节点,这里需要用到谓语,谓语语法是用中括号指定特定的节点。
表达式 | 描述 |
---|---|
[index] | 选取某节点的第 index 元素 |
[last()] | 选取某节点的最后一个元素 |
[position()<index] | 选择某节点的前 index 个元素 |
[@name] | 选取包含 name 属性的元素 |
[name>iddex] | 选取属性 name 值大于 index 的元素 |
2.3 通配符
XPath 在进行多节点选取时,可以使用通配符“*”匹配未知元素,使用通配符“|”一次选取多条路径。
2.4 实例
下面以上述 XML 文档为例,通过 XPath 选取元素,演示 XPath 的语法。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <classroom> 3 <student> 4 <id>10001</id> 5 <name lang="zh-CN">Tom</name> 6 <age>22</age> 7 <sex>male</sex> 8 </student> 9 <student> 10 <id>10002</id> 11 <name lang="zh-CN">Jack</name> 12 <age>21</age> 13 <sex>female</sex> 14 </student> 15 </classroom>
实现效果 | 路径表达式 |
---|---|
选取 classroom 元素所有子节点 | classroom |
选取根元素 classroom | /classroom |
选取元素 classroom 的子元素的所有 student 元素 | classroom/student |
选取元素 student | //student |
选取元素 classroom 的后代 student 元素 | classroom//studetn |
选取名为 zh-CN 所有属性 | //@lang |
选取元素 classroom 的第 1 个 student 子元素 | classroom/student[1] |
选取元素 name,且有值为 zh-CN 的 lang 属性 | //name[@lang=’zh-CN’] |
选取元素 classroom 的所有子元素 | classroom/* |
选取文档中所有元素 | //* |
选取所有带有属性的 name 元素 | //name[@*] |
选取元素 student 的所有 name 元素和 age 元素 | //student/name | //student/age |
3. XPath 轴
轴定义了所选节点与当前节点之间的树关系,XPath 中使用到的节点集如下表所示。
轴 | 含义 |
---|---|
child | 选取当前节点的所有子元素 |
parent | 选取当前节点的父节点 |
ancestor | 选取当前节点的所有先辈节点 |
ancestor-or-self | 选取当前节点的所有先辈节点以及当前节点本身 |
descendant | 选取当前节点的所有后代元素 |
descendant-or-self | 选取当前节点的所有后代元素以及当前节点本身 |
preceding | 选取文档中当前节点的开始标记之前的所有节点 |
following | 选取文档中当前节点的结束标记之后的所有节点 |
preceding-sibling | 选取当前节点之前的所有同级节点 |
following-sibling | 选取当前节点之后的所有同级节点 |
self | 选取当前节点 |
attribute | 选取当前节点的所有属性 |
namespace | 选取当前节点的所有命名空间节点 |
4. XPath 运算符
XPath 表达式可以返回节点集、字符串、逻辑值和数字,表达式中可以使用运算符进行连接,运算符如下表所示。
运算符 | 含义 |
---|---|
| | 计算两个节点集 |
+ | 加法 |
- | 减法 |
* | 乘法 |
div | 除法 |
= | 等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
or | 或 |
and | 与 |
mod | 取余 |