xpath_基础用法

3 min read

XML Path Language

xml路径语法,xml是常见的一种序列化方式,html页面就是一种xml。学习xpath可以使用其快速定位xml元素。

基础语法

首先打开http://xpather.com/,这个页面是一个很好的学习xpath语法的页面,上方的输入框可以输入xpath语法,过滤出来的元素会高亮,并在右侧显示。

选取节点:

  • . 表示当前节点,默认从最根部开始
  • .. 向上翻,即父节点
  • / 一级子节点,app/xx 表示app下的一级子节点中的xx元素
  • // 子孙节点,app//xx 表示app下所有的xx元素
  • * 匹配任意类型节点,app/* 表示app下所有节点(不含app)
  • [] 过滤节点,匹配多个节点时用[1]表示第一个,注意下标是从1开始而非0

例如选取 第一个extra-notes下的一级子节点中的第二个note元素,就可以这么写:

//extra-notes[1]//note[2]

image

选取属性和文本

  • /@ 拿属性,app/@name 表示获取app元素中的name属性值.
  • //@ 拿属性,app//@name 表示app及以下所有元素中的name属性值
  • [@xx='aa'] 过滤属性xx值是aa的节点。
  • /text() 获取当前元素下的文本
  • //text() 获取当前元素和子元素下的文本
  • [text()='hh'] 获取文本内容是hh的元素,
  • /normalize-space() 获取当前元素的内部文本去掉空格。经常hh前面有空格,导致匹配不出来可以使用//*[normalize-space() = 'hh'],注意该函数修饰的节点如果有子节点文本是拼起来用空格隔开的。

image

常见的函数(除了上面的text normalize-space)

  • name() 标签名
  • contains 文本包含,//*[contains(@name,'Fra')] name属性包含Fra的节点
  • lower-case 小写,//*[contains(lower-case(@name),'fra')]
  • starts-with/ends-with //*[starts-with(text(),'Fra')]
  • node 所有节点,/a/node() 等价于 /a/*
  • child::node() 子节点。
  • parent::node() 父节点 等价于..
  • ancestor::node() 所有祖节点,父,祖父...
  • count 求表达式选出的节点数 count(//app)