XPath 语言:XML 文档的高效查询工具
XPath(XML Path Language)是一门专门用于在 XML 文档中定位和选择节点的查询语言,它通过简洁的路径表达式,能够快速定位 XML 文档中的特定元素、属性或文本,常与 XML 解析器(如 DOM、SAX)结合使用,广泛应用于数据提取、配置文件解析等场景。
XPath 的核心概念:节点
XPath 将 XML 文档视为一个节点树,所有内容都被抽象为不同类型的节点,主要包括:
| 节点类型 | 说明 | 示例 |
|---|---|---|
| 文档根节点 | 整个文档的根(非整个文档的最外层元素) | 无具体名称,代表整个 XML 文档树 |
| 元素节点 | XML 中的标签元素 | <book>、<name> |
| 属性节点 | 元素的属性 | id="1001"中的id属性 |
| 文本节点 | 元素内的文本内容 | <name>XML指南</name>中的 “XML 指南” |
| 注释节点 | XML 中的注释 | <!-- 这是注释 --> |
| 处理指令节点 | 用于指导解析器的指令 | <?xml version="1.0"?> |
| 命名空间节点 | 元素声明的命名空间 | xmlns:xs="http://www.w3.org/2001/XMLSchema" |
XPath 路径表达式:定位节点的核心语法
XPath 通过路径表达式选取节点或节点集,表达式由多个 “步” 组成,步之间用斜线(/)分隔。例如:/bookstore/book/name表示选取根节点下bookstore元素的子元素book中的name元素。
路径表达式的基本格式
每个 “步” 的完整语法为:
1 | 轴::节点测试[限定谓语] |
- 轴(Axis):定义当前节点与目标节点的结构关系(如父子、祖先后代)。
- 节点测试(Node Test):筛选轴所匹配的节点类型(如元素、文本)。
- 限定谓语(Predicate):进一步过滤节点集(类似条件判断)。
轴(Axis):定义节点关系
轴用于描述目标节点与当前节点的位置关系,常用轴及其简写形式如下:
| 轴名称 | 含义 | 简写形式 |
|---|---|---|
child |
选取当前节点的直接子元素(默认轴) | 可省略(如book等效于child::book) |
parent |
选取当前节点的父节点 | .. |
self |
选取当前节点本身 | . |
attribute |
选取当前节点的属性 | @ |
descendant |
选取当前节点的所有后代后代(子、孙等) | //(用于路径开头或中间) |
ancestor |
选取当前节点的所有祖先先辈(父、祖父等) | 无 |
preceding-sibling |
选取当前节点之前的同级同级节点 | 无 |
following-sibling |
选取当前节点之后的同级节点 | 无 |
示例:
child::book:选取当前节点的直接子元素book(等效于book)。@id:选取当前节点的id属性(等效于attribute::id)。..:选取当前节点的父节点(等效于parent::node())。//name:选取文档中所有name元素(无论位置,等效于/descendant::name)。
节点测试(Node Test):筛选节点类型
节点测试用于从轴匹配的节点中筛选特定类型的节点,常用测试规则:
| 节点测试 | 含义 | 示例 |
|---|---|---|
nodename |
选取指定名称的元素节点 | child::book 选取子元素book |
* |
通配符,选取所有元素节点 | child::* 选取所有子元素 |
text() |
选取文本节点 | child::text() 选取子元素中的文本 |
comment() |
选取注释节点 | //comment() 选取所有注释 |
node() |
选取所有类型的节点(元素、文本、属性等) | child::node() 选取所有子节点 |
示例:
book/*:选取book元素的所有子元素(无论名称)。book/text():选取book元素的直接文本内容。//node():选取文档中所有类型的节点。
限定谓语(Predicate):条件过滤
谓语是放在方括号([])中的布尔表达式,用于进一步过滤节点集,常用来指定位置、属性值等条件。
常用谓语示例:
book[1]:选取第一个book子元素(索引从 1 开始)。book[last()]:选取最后一个book子元素。book[@id]:选取包含id属性的book元素。book[@id='1001']:选取id属性值为1001的book元素。book[price>30]:选取price子元素值大于 30 的book元素。
复杂示例:
//book[author='张三' and price<50]:选取作者为 “张三” 且价格小于 50 的所有book元素。book[position()<3]:选取前两个book子元素。
常用路径表达式示例
假设存在如下 XML 文档(books.xml):
1 |
|
以下是常用路径表达式及其结果:
| 路径表达式 | 含义 | 结果 |
|---|---|---|
/bookstore |
选取根元素bookstore |
匹配<bookstore>...</bookstore> |
/bookstore/book |
选取bookstore的直接子元素book |
匹配两个<book>元素 |
//book |
选取所有book元素(无论位置) |
匹配两个<book>元素 |
//@id |
选取所有id属性 |
匹配id="1001"和id="1002" |
//book[@id='1001'] |
选取id为1001的book元素 |
匹配第一个<book>元素 |
//book/name/text() |
选取所有book元素中name的文本内容 |
结果为 “XML 指南” 和 “Java 编程” |
/bookstore/*[1] |
选取bookstore的第一个子元素 |
匹配第一个<book>元素 |
//book[price>50]/name |
选取价格大于 50 的book的name元素 |
匹配<name>Java编程</name> |
XPath 的应用场景
XPath 广泛应用于需要解析和提取 XML 数据的场景:
- 数据提取:从复杂 XML 文档中快速提取特定节点(如从配置文件中读取参数)。
- XML 验证:结合 XSLT 或 Schema 验证 XML 结构是否符合预期。
- 自动化测试:在 UI 自动化测试中定位 XML 格式的配置项或响应数据。
- 网页解析:XPath 也是 HTML 解析的常用工具(如爬虫中提取网页元素)。
v1.3.10