XPath 1.0 完整用法指南
一、XPath 1.0 概述
XPath 1.0 是W3C于1999年发布的XML路径语言标准,用于在XML文档中定位和选择节点。
二、基本概念
节点类型
- 根节点 - 文档的根
- 元素节点 - XML元素
- 属性节点 - 元素的属性
- 文本节点 - 元素的文本内容
- 注释节点 - XML注释
- 处理指令节点 - 处理指令
三、定位路径语法
- 基本定位路径
python
// 绝对路径
/root/child/grandchild
// 相对路径
child/grandchild
// 选择所有元素
*
// 当前节点
.
// 父节点
..
- 轴(Axes)
python
// 子节点
child::book
// 后代节点
descendant::chapter
// 父节点
parent::book
// 祖先节点
ancestor::section
// 后面的兄弟节点
following-sibling::chapter
// 前面的兄弟节点
preceding-sibling::chapter
// 属性
attribute::id
@id // 简写形式
// 命名空间
namespace::*
// 所有后代(包括当前节点)
descendant-or-self::node()
// 所有祖先(包括当前节点)
ancestor-or-self::div
四、谓词(Predicates)
基本谓词
python
// 按位置选择
/book[1] // 第一个book元素
/book[last()] // 最后一个book元素
/book[position() > 1] // 除第一个外的所有book
// 按属性选择
// 有id属性的book
/book[@id]
// id为"123"的book
/book[@id='123']
// id包含"abc"的book
/book[contains(@id, 'abc')]
复合谓词
python
// 多条件
/book[@category='fiction' and @price>20]
/book[@category='fiction' or @category='non-fiction']
/book[not(@outofprint)]
五、运算符
比较运算符
python
= // 等于
!= // 不等于
< // 小于
<= // 小于等于
> // 大于
>= // 大于等于
布尔运算符
python
and
or
not()
算术运算符
python
+ // 加法
- // 减法
* // 乘法
div // 除法
mod // 取模
六、核心函数
节点集函数
python
// 计数
count(book) // book元素数量
// 位置
position() // 当前节点位置
last() // 最后一个位置
// 本地名称
local-name() // 节点本地名
local-name(book) // book元素的本地名
// 命名空间URI
namespace-uri()
// 节点名称
name() // 节点完整名称
字符串函数
python
// 字符串操作
string() // 转换为字符串
concat('a', 'b', 'c') // 连接字符串
starts-with('abc', 'ab') // 是否以某字符串开头
contains('abc', 'bc') // 是否包含子串
substring('abc', 2) // 从位置2开始截取
substring('abc', 2, 1) // 从位置2截取1个字符
string-length('abc') // 字符串长度
normalize-space(' a b ') // 规范化空白字符
translate('abc', 'abc', 'ABC') // 字符替换
substring-before('a/b', '/') // 返回'/'之前的部分
substring-after('a/b', '/') // 返回'/'之后的部分
布尔函数
python
boolean() // 转换为布尔值
true() // 返回true
false() // 返回false
not() // 逻辑非
lang('en') // 检查语言
数值函数
python
number() // 转换为数字
sum() // 求和
floor() // 向下取整
ceiling() // 向上取整
round() // 四舍五入
七、实用示例
- 选择特定节点
python
// 选择所有book元素
//book
// 选择所有price元素
//price
// 选择book的所有子元素
/book/*
- 条件选择
python
// 选择价格>30的book
//book[price > 30]
// 选择有author子元素的book
//book[author]
// 选择第一个chapter
//chapter[1]
// 选择倒数第二个book
//book[last()-1]
- 属性选择
python
// 选择所有id属性
//@id
// 选择特定属性值
//book[@id='b001']
// 选择多个属性值之一
//book[@category='fiction' or @category='novel']
- 文本和注释
python
// 选择文本节点
//book/title/text()
// 选择注释
//book/comment()
八、高级用法
- 联合查询
python
// 选择book和magazine元素
//book | //magazine
// 选择title和author
//book/title | //book/author
- 嵌套路径
python
// 选择chapter下的所有section标题
//chapter//section/title
// 选择父元素
//title/../@id
- 使用变量(在XSLT中)
python
// XSLT中使用
<xsl:variable name="minPrice" select="20"/>
//book[price > $minPrice]
九、注意事项
- 大小写敏感:XML元素和属性名称区分大小写
- 索引从1开始:XPath中位置索引从1开始
- 空节点集:不存在的节点返回空节点集,不会报错
- 上下文节点:相对路径基于当前上下文节点
- 性能考虑://操作符可能影响性能,应谨慎使用
十、浏览器控制台测试
javascript
// 在浏览器中测试XPath
const result = document.evaluate(
'//div[@class="content"]',
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
for (let i = 0; i < result.snapshotLength; i++) {
console.log(result.snapshotItem(i));
}
这个指南涵盖了XPath 1.0的主要功能,适用于大多数XML处理场景。