XPath 语法笔记

发布于:2024-07-06 ⋅ 阅读:(44) ⋅ 点赞:(0)

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']
  • 示例: 若要选择所有本地名称为symw:font属性值为"Arial"的元素,可以使用
    .//*[local-name()='sym' and @w:font='Arial']
    
    选取所有带有属性的 sym元素。
    .//*[local-name()='sym' and @*]
    

3. 选择属性值不等于特定值的元素

  • 表达式: //*[local-name()='elementName'][not(@attributeName='value')]
  • 示例: 若要选择所有本地名称为symw: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 参考手册 - 语法


网站公告

今日签到

点亮在社区的每一天
去签到