XPath 语法笔记
XPath 表达式
- 当使用命名空间时,确保在XPath引擎中正确声明命名空间的前缀和URI。
表达式 | 说明 |
---|---|
nodename |
选择 nodename 节点的所有子节点 |
/ |
单斜杠表示绝对路径。它总是从XML文档的根节点开始 |
// |
双斜杠表示任意深度的后代路径 |
. |
代表当前节点 |
.. |
代表当前节点的父节点 |
* |
匹配任意节点 |
//* |
当前文档的所有元素(任意深度 + 任意节点) |
@* |
选择所有属性。 放在[@*] 中,表示带任何属性 |
local-name() |
使用此函数时,XPath会忽略命名空间,只考虑元素的本地名称 |
[] |
谓语(Predicates)[] 用于填写匹配条件 |
运算符
下面是XPath支持的运算符及其说明和示例的表格:
运算符 | 说明 | 举例 |
---|---|---|
= |
等于比较 | price = 10 |
!= |
不等于比较 | price != 10 |
< |
小于比较 | year < 2000 |
<= |
小于等于比较 | year <= 2000 |
> |
大于比较 | quantity > 5 |
>= |
大于等于比较 | quantity >= 5 |
+ |
加法运算 | sum + 10 |
- |
减法运算 | total - sum |
* |
乘法运算 | width * height |
div |
XPath 2.0 开始 除法运算 | 4 div 2 |
mod |
取模运算 | 10 mod 3 |
and |
逻辑与 | status = 'active' and year > 2000 |
or |
逻辑或 | status = 'active' or status = 'pending' |
union |
集合并集 | set1 union set2 |
| |
节点集并集 | nodeList1 | nodeList2 |
? |
XPath 3.0 引入的序列类型测试 | xs:int() ? 1 |
注意:?
运算符是XPath 3.0及更高版本引入的,用于序列类型测试,不适用于所有XPath版本。在实际使用中,应根据XPath版本选择适用的运算符。
谓语(Predicates)
方括号中的谓语可以是任何表达式,只要它能返回一个布尔值。这可以是属性测试、位置测试或任何其他逻辑表达式。
- 过滤节点集合。
- 检索满足特定条件的节点。
- 访问节点的属性或计算表达式的值。
例如:
book[price > 30]
选择所有price
属性大于30的book
元素。*/chapter[title='Introduction']
选择所有子元素中标题为"Introduction"的chapter
元素。
1. 选择所有本地名称为特定名称的元素
- 表达式:
//*[local-name()='elementName']
- 示例: 若要选择所有本地名称为
sym
的元素,可以使用.//*[local-name()='sym']
2. 选择具有特定属性的元素
- 表达式:
//*[local-name()='elementName' and @attributeName='value']
- 示例: 若要选择所有本地名称为
sym
且w:font
属性值为"Arial"
的元素,可以使用
选取所有带有属性的.//*[local-name()='sym' and @w:font='Arial']
sym
元素。.//*[local-name()='sym' and @*]
3. 选择属性值不等于特定值的元素
- 表达式:
//*[local-name()='elementName'][not(@attributeName='value')]
- 示例: 若要选择所有本地名称为
sym
但w:font
属性值不为"Arial"
的元素,可以使用.//*[local-name()='sym'][not(@w:font='Arial')]
4. 选择元素内容中包含特定字符串的节点
- 表达式:
//*[contains(text(), 'string')]
- 示例: 若要选择所有内容中包含单词
example
的段落,可以使用//p[contains(text(), 'example')]
5. 选择元素内容中不包含特定字符串的节点
- 表达式:
//*[not(contains(text(), 'string'))]
- 示例: 若要选择所有内容中不包含单词
example
的段落,可以使用//p[not(contains(text(), 'example'))]
6. 选择特定命名空间内的元素
- 表达式:
//namespace:elementName
- 示例: 若要选择
http://schemas.openxmlformats.org/wordprocessingml/2006/main
命名空间下的所有sym
元素,可以使用(其中w
命名空间必须在XPath引擎中被正确声明。)//w:sym
7. 选择元素的属性
- 表达式:
//*[local-name()='elementName']/@attributeName
- 示例: 若要选择所有
sym
元素的w:char
属性,可以使用.//*[local-name()='sym']/@w:char
8. 选择元素的所有属性
- 表达式:
//*[local-name()='elementName']/@*
- 示例: 若要选择所有
sym
元素的所有属性,可以使用.//*[local-name()='sym']/@*
9. 选择所有子孙元素
- 表达式:
//elementName
- 示例: 若要选择文档中所有的
p
元素,无论它们处于哪个层级,可以使用//p
10. 选择当前节点的父节点
- 表达式:
..
- 示例: 如果当前节点是
<p>...</p>
,那么..
将指向包含它的父节点。..
参考资料
XPath 1.0 规范: https://www.w3.org/TR/xpath/
XPath 2.0 规范: https://www.w3.org/TR/xpath-20/
XPath 3.1 规范: https://www.w3.org/TR/xpath-31/