学一点XPath

(首发于 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 选取此节点的所有子节点
/ 从根节点选取
// 选择任意位置的某个节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

路径表达式中绝对路径、相对路径和步的概念如下所示。

  1. 绝对路径起始于正斜杠 (/)。
  2. 相对路径可以起始于任何节点。
  3. 步包括轴、节点测试、零个或多个谓语,用来更深入地选取节点集,语法为:轴名称::节点测试[谓语]

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 取余
 

猜你喜欢

转载自www.cnblogs.com/yhw-miracle/p/10235086.html