XPath 语法笔记
- XPath 表达式
- 运算符
- 谓语(Predicates)
- 1. 选择所有本地名称为特定名称的元素
- 2. 选择具有特定属性的元素
- 3. 选择属性值不等于特定值的元素
- 4. 选择元素内容中包含特定字符串的节点
- 5. 选择元素内容中不包含特定字符串的节点
- 6. 选择特定命名空间内的元素
- 7. 选择元素的属性
- 8. 选择元素的所有属性
- 9. 选择所有子孙元素
- 10. 选择当前节点的父节点
 
- 参考资料
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/
菜鸟教程 XPath 参考手册 - 语法