0%

XPath语言

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属性值为1001book元素。
  • book[price>30]:选取price子元素值大于 30 的book元素。

复杂示例

  • //book[author='张三' and price<50]:选取作者为 “张三” 且价格小于 50 的所有book元素。
  • book[position()<3]:选取前两个book子元素。

常用路径表达式示例

假设存在如下 XML 文档(books.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0"?>
<bookstore>
<book id="1001">
<name>XML指南</name>
<author>张三</author>
<price>49.9</price>
</book>
<book id="1002">
<name>Java编程</name>
<author>李四</author>
<price>59.9</price>
</book>
<magazine>
<name>编程周刊</name>
<price>15.0</price>
</magazine>
</bookstore>

以下是常用路径表达式及其结果:

路径表达式 含义 结果
/bookstore 选取根元素bookstore 匹配<bookstore>...</bookstore>
/bookstore/book 选取bookstore的直接子元素book 匹配两个<book>元素
//book 选取所有book元素(无论位置) 匹配两个<book>元素
//@id 选取所有id属性 匹配id="1001"id="1002"
//book[@id='1001'] 选取id1001book元素 匹配第一个<book>元素
//book/name/text() 选取所有book元素中name的文本内容 结果为 “XML 指南” 和 “Java 编程”
/bookstore/*[1] 选取bookstore的第一个子元素 匹配第一个<book>元素
//book[price>50]/name 选取价格大于 50 的bookname元素 匹配<name>Java编程</name>

XPath 的应用场景

XPath 广泛应用于需要解析和提取 XML 数据的场景:

  1. 数据提取:从复杂 XML 文档中快速提取特定节点(如从配置文件中读取参数)。
  2. XML 验证:结合 XSLT 或 Schema 验证 XML 结构是否符合预期。
  3. 自动化测试:在 UI 自动化测试中定位 XML 格式的配置项或响应数据。
  4. 网页解析:XPath 也是 HTML 解析的常用工具(如爬虫中提取网页元素)。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10