0%

Xpath元素定位

Xpath简介

XPathXML Path的简称,它是一种用来确定XML(可扩展标记语言)文档中某部分位置的语言。Xpath也是一种表达式语言,它基于XML的树状结构,可以用来在整个树中来寻找指定的节点,因此它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。

Xpath定位方法

Xpath选取节点

/ 表示从根节点开始选取
// 表示选择任意位置的某个节点,而不考虑它们的位置
nodename 选取此节点的所有子节点。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

以html选择节点为例

由于HTML文档本身就是一个标准的XML页面,因此我们可以使用XPath的语法来定位页面元素。

定位节点

/html/body/form/input 查找form下所有input节点元素
//input 查找html中所有input节点元素

使用通配符(*)选择未知的元素

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。


//form/* 查找form下所有节点元素
//* 查找html中所有节点元素
//*/input 查找所有input节点元素
//title[@*] 选取所有带有属性的 title 元素。

选择分支

对于存在多个元素时想唯一定位,可以使用[]中括号来选择分支,下标从1开始

//*/td[7]/a[1] 定位到第7td元素中第1a元素
//*/td[7]/span[2] 定位到第7td元素中第2span元素
//*/td[last()]/a[last()] 定位到最后一个td元素中最后一个a元素
//*/td[a] 定位包含a元素的所有td元素

选择最后一个元素可以用last()函数,但是选择第一个元素没有first()函数。

选择属性

还可以利用标签内的属性来加以区分定位,在<>开始标记内除标签外,其他都可以看做是属性.

//input[@name] 定位所有含name属性的input元素
//input[@*] 定位所有含属性的input元素
//input[@value='2'] 定位出value属性值为2input元素
//input[@type='vedio'][@value='1']//input[@type='vedio' and @value='1'] 多个属性定位
//input/@id 返回所有input元素的id属性

选取若干路径

过在路径表达式中使用|运算符,您可以选取若干个路径。

路径表达式 结果
`//book/title //book/price`
`//title //price`
`/bookstore/book/title //price`

常用函数

  • 字符串查找函数: contains()

    contains(string1,string2),表示如果 string1 包含 string2,则返回 true,否则返回 false

  • 获取元素的文本内容: text()
  • 从起始位置匹配字符串:starts-with()

更多函数可参考:http://www.w3school.com.cn/xpath/xpath_functions.asp

//a[contains(@href,'baidu')] 定位href属性中包含baidu的所有a元素
//a[text()='推广'] 链接文本信息是推广的所有a元素
//a[starts-with(@href,'/ads')] 链接href属性以/ads开始的所有a元素
//a[contains(text(),'推广')] 链接文本信息包含推广的所有a元素

Xpath轴

上面这些方法都不能定位时,这时候就得考虑依据元素的父辈、兄弟或者子辈节点来定位了,这就需要用到Xpath轴,利用轴可定位某个相对于当前节点的节点集。

语法:

轴名称::标签名
轴名称 描述
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。


例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点。
attribute::lang 选取当前节点的 lang 属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::book 选取当前节点的所有 book 后代。
ancestor::book 选择当前节点的所有 book 先辈。
ancestor-or-self::book 选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price 选取当前节点的所有 price 孙节点。

示例

XPath教程