一.为什么学习XPath
XPath (XML Path Language)最初是用来在 XML 文档中定位 DOM 节点的语言。由于 HTML 也可以算作 XML 的一种实现,所以 Selenium Webdriver也可以利用 XPath 这一强大的语言来定位 Web元素。XPath在传统属性定位之外扩展了元素定位能力,以便应对没有ID或name属性的情况。利用 XPath 可以通过绝对路径,或者相对于一个可精确定位的元素的相对路径来定位。为了保证定位的健壮性,推荐使用相对路径和基于位置关系的定位。
二.什么是XPath
XPath 是一门在XML文档中查找信息的语言,它一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。XPath 可用来在 XML 文档中对元素和属性进行遍历。同时XPath是用于在网页上识别元素的技术,它就像HTML元素的地址。在XPath 有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。基本值(或称原子值,Atomic value)是无父或无子的节点。项目(Item)是基本值或者节点。xpath的作用就是两个字“定位”,运用各种方法进行快速准确的定位,推荐两个非常有用的的firefox工具:firebug和xpath checker。
三.初识XPath
以一个XML文件为例,来看看XPath如何定位元素:
<?xml version="1.0"?>
<root>
<child attr="attr" />
<child>
<a><desc /></a>
</child>
</root>
针对上面的XML文档应用XPath定位节点:
- 选取root:/root 或者root
- 选取根节点下的所有child元素://child
- 选取属性是attr的节点://@attr
四.XPath语法
1. 基本概念
A. 节点(Node)
1) 根节点(Root Node)
根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。
2) 元素节点(Element Nodes)
元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。
3) 文本节点(Text Nodes)
文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。
4) 属性节点(Attribute Nodes)
每 一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元 素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。
对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为 #IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。
此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。
5) 命名空间节点(Namespace Nodes)
每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。
6) 处理指令节点(Processing Instruction Nodes)
处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。
7) 注释节点(Comment Nodes)
注释节点对应于文档中的注释。
B. 基本值(或称原子值,Atomic value)
<