用XPath精肯定位节点元素&selenium使用Xpath定位之完整篇

在利用XSL进行转换的过程当中,匹配的概念很是重要。在模板声明语句 xsl:template match = ""和模板应用语句xsl:apply-templates select = "" 中,用引号括起来的部分必须可以精确地定位节点。具体的定位方法则在XPath中给出。html

之因此要在XSL中引入XPath的概念,目的就是为了在匹配XML文档结构树时可以准确地找到某一个节点元素。能够把XPath比做文件管理路 径:经过文件管理路径,能够按照必定的规则查找到所须要的文件;一样,依据XPath所制定的规则,也能够很方便地找到XML结构文档树中的任何一个节 点,显然这对XSLT来讲是一个最最基本的功能。node

XPath数据类型sql

XPath可分为四种数据类型:编程

  • 节点集(node-set) 
    节点集是经过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。
  • 布尔值(boolean) 
    由函数或布尔表达式返回的条件匹配值,与通常语言中的布尔值相同,有true和 false两个值。布尔值能够和数值类型、字符串类型相互转换。
  • 字符串(string) 
    字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。
  • 数值(number) 
    在XPath 中数值为浮点数,能够是双精度64位浮点数。另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大infinity、负无 穷大-infinity、正负0等等。number的整数值能够经过函数取得,另外,数值也能够和布尔类型、字符串类型相互转换。

其中后三种数据类型与其它编程语言中相应的数据类型差很少,只是第一种数据类型是XML文档树的特有产物。app

XPath节点类型编程语言

另外,因为XPath包含的是对文档结构树的一系列操做,所以搞清楚XPath节点类型也是很必要的。回忆一下第二章中讲到的XML文档的逻辑结 构,一个XML文件能够包含元素、CDATA、注释、处理指令等逻辑要素,其中元素还能够包含属性,并能够利用属性来定义命名空间。相应地,在XPath 中,将节点划分为七种节点类型:函数

  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) 
    注释节点对应于文档中的注释。

一个XML文档树ui

咱们来构造一棵XML文档树,做为后面举例的依托:spa


<A id="a1">
<B id="b1">
<C id="c1">
<B name="b"/>
<D id="d1"/>
<E id="e1"/>
<F id="e2"/>
</C>
</B>
<B id="b2"/>
<C id="c2">
<B/>
<D id="d2"/>
<F/>
</C>
<E/>
</A>

如下将要介绍一些XPath中节点匹配的基本方法。翻译

路径匹配

路径匹配与文件路径的表示相仿,比较好理解。有如下几个符号:

(1)用“/”指示节点路径 
如“/A/C/D” 表示节点"A"的子节点"C"的子节点"D",即id值为d2的D节点, “/”表示根节点。

(2)用“//” 表示全部路径以"//"后指定的子路径结尾的元素 
如“//E” 表示全部E元素,结果是全部三个E元素,如“//C/E”表示全部父节点为C的E元素,结果是id值为e1和e2的两个E元素 。

(3)用“*” 表示路径的通配符 
如“/A/B/C/*”表示 A元素→B元素→C元素下的全部子元素,即name值为b的B元素、 id值为d1的D元素和id值为e1和e2的两个E元素 
“/*/*/D”表示上面有两级节点的D元素,匹配结果是id值为d2的D元素 ,如“//*”表示全部的元素。

位置匹配

对于每个元素,它的各个子元素是有序的。

如:/A/B/C[1]表示A元素→B元素→C元素的第一个子元素,获得name值为b的B元素

/A/B/C[last()]表示A元素→B元素→C元素的最后一个子元素,获得id值为e2的E元素

/A/B/C[position()>1]表示A元素→B元素→C元素之下的位置号大于1的元素,获得id值为d1的D元素和两个具备id值的E元素

属性及属性值

在XPath中能够利用属性及属性值来匹配元素,要注意的是,元素的属性名前要有"@"前缀。例如:

//B[@id]表示全部具备属性id的B元素,结果为id值为b1和b2的两个B元素

//B[@*]表示全部具备属性的B元素,结果为两个具备id属性的B元素和一个具备name属性B元素

//B[not(@*)]表示全部不具备属性的B元素,结果为A元素→C元素下的B元素

//B[@id="b1"] id值为b1的B元素,结果为A元素下的B元素

亲属关系匹配

XML文档可归结为树型结构,所以任何一个节点都不是孤立的。一般咱们把节点之间的归属关系归结为一种亲属关系,如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时,一样能够用到这些概念。例如:

//E/parent::* 表示全部E节点的父节点元素,结果为id值为a1的A元素和id值为c1的C元素

//F/ancestor::* 表示全部F元素的祖先节点元素,结果为id值为a1的A元素和id值为c2的C元素

/A/child::* 表示A的子元素,结果为id值为b一、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素

/A/descendant::* 表示A的全部后代元素,结果为除A元素之外的全部其它元素

//F/self::* 表示全部F的自身元素,结果为F元素自己

//F/ancestor-or-self::* 表示全部F元素及它的祖先节点元素,结果为F元素、F元素的父节点C元素和A元素

/A/C/descendant-or-self::* 表示全部A元素→C元素及它们的后代元素,结果为id值为c2的C元素、该元素的子元素B、D、F元素

/A/C/following-sibling::* 表示A元素→C元素的紧邻的后序全部兄弟节点元素,结果为没有任何属性的E元素

/A/C/preceding-sibling::* 表示A元素→C元素的紧邻的前面全部兄弟节点元素,结果为id值为b1和b2的两个B元素

/A/B/C/following::* 表示A元素→B元素→C元素的后序的全部元素,结果为id 为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、/无属性的E元素。

/A/C/preceding::* 表示A元素→C元素的前面的全部元素,结果为id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为 b的B元素、id为c1的C元素、id为b1的B元素

条件匹配

条件匹配就是利用一些函数的运算结果的布尔值来匹配符合条件的节点。经常使用于条件匹配的函数有四大类:节点函数、字符串函数、数值函数、布尔函数。例如last()、position()等等,这里咱们就再也不赘述。

以上这些匹配方法中,用得最多的还要数路径匹配。在上一章样式表的例子中,不管是在语 句<xsl:template match="学生花名册">中,仍是在语句 <xsl:value-of select="名字"/>中,都是依靠给出相对于当前路径的子路径来定位节点的。
_______________________________________________________

4.XPath的语法 

咱们在前面已经提到过,XPath是用来帮助XSLT在XML源文档中查找定位信息的语言。在实际使用过程 中,XPath和XSLT老是混在一块儿使用,在上面一章的语法例子中咱们已经有使用到XPath的语法,只是没有明确点出。但W3C将它们分红两个标准, 因此咱们也将它们拆成两章来说解。 

4.XPath的语法 

4.1 当前位置 
4.2 寻址操做 
4.3 运算符 
4.4 功能函数 

4.1 当前位置 

当 咱们使用XSLT处理XML源文档是,咱们用Context来表示当前正在被模板处理的节点位置。好比xsl:template match="/"语句中表示Context在文档的根(root)节点。我不知道如何准确的翻译Context这个词,它相似于C语言里的指针,表示程 序当前运行的位置。理解Context对于正确处理XSL模板很是重要,当您的XSL模板输出的文档和您想要的不同,最早应该分析的就是Context 在哪里。
Location Paths是用于设定你想要寻找的Context节点位置。就相似DOS的目录命令。咱们看个例子

<xsl:for-each select="child::PEOPLE/descendant::PERSON"> 

其中child::PEOPLE/descendant::PERSON就是XPath语法,这个表达式就是一个Location Paths,代码说明要显示全部PEOPLE元素的子元素和全部PERSON元素的子元素。一般咱们会采用更简单的写法:

<xsl:for-each select="PEOPLE//PERSON"> 

咱们来解释path的两种表示方法:"/"和"//"。
"/"是表示当前文档的节点,相似DOS目录分割符。例如:/PEOPLE表示选择根节点下的PEOPLE元素;PEOPLE/PERSON表示选择PEOPLE元素下全部的PESON子元素。
"//"则表示当前文档全部的节点。相似查看整个目录。例如://PEOPLE表示选择文档中全部的PEOPLE元素,不管它在什么层次;PEOPLE//PERSON表示在PEOPLE元素下全部的PERSON元素,不管它的层次多深。

4.2 寻址操做 

Axis和Predicate是XPath语法中对Location Paths进行定位操做的语法,具体的用法列表以下

Axis语法表
--------------------------------------------------------
表达式 简写 说明
--------------------------------------------------------
self . 选择当前的节点.。
例子 :
<TD><xsl:value-of select="."/></TD>
代码表示在当前位置插入当前的节点包含的文本(text)值,
--------------------------------------------------------
parent .. 选择当前节点的父节点。 
--------------------------------------------------------
attribute @ 选择一个元素的全部属性。 
例子:
<TD><xsl:value-of select="@PERSONID"/></TD>
选择PERSON元素的全部属性.
--------------------------------------------------------
child 选择当前节点的全部子元素。
--------------------------------------------------------
ancestor 选择当前节点的全部父元素(包括父元素的父元素,类推)
--------------------------------------------------------

Axis帮助咱们选择当前节点周围全部的节点,而Predicate则用来定位当前节点内部的元素。表示方法为方括号[]中加表达式:[ Expression ]。具体举例以下:

PERSON[position()=2] 
这句代码表示寻找第二个"PERSON" 元素

PERSON[starts-with(name, "B")] 
这句代码表示寻找全部名称以"B"开头的PERSON元素。 

4.3 运算符 

这一节介绍XPath的运算符(Expressions),列表以下:
--------------------------------------------------------
运算符 说明
--------------------------------------------------------
and, or 就是普通意义的and, or 
--------------------------------------------------------
= 等于
--------------------------------------------------------
!= 不等于
--------------------------------------------------------
>, >= 大于,大于等于
--------------------------------------------------------
<, <= 小于,小于等于。注意:在XSL文件中,<符号要用< 表示
--------------------------------------------------------
+, -, *, div 加减乘除 
--------------------------------------------------------
mod 取模
--------------------------------------------------------
| 两个节点一块儿计算
--------------------------------------------------------

________________________________________________________________

selenium使用Xpath定位之完整篇

其中有一片文章提到了xpath元素定位,可是该文章中有些并不能适应一些特殊与个性化的场景。在文本中提供xpath元素的定位终极篇,你必定能在这里找到你须要的解决办法。

第一种方法:经过绝对路径作定位(相信你们不会使用这种方式)

By.xpath("html/body/div/form/input")
By.xpath("//input")
第三种方法:经过元素索引定位
By.xpath("//input[4]")
第四种方法:使用xpath属性定位(结合第二、第3中方法可使用)
By.xpath("//input[@id='kw1']")
By.xpath("//input[@type='name' and @name='kw1']")
第五种方法:使用部分属性值匹配(最强大的方法)
By.xpath("//input[start-with(@id,'nice')
By.xpath("//input[ends-with(@id,'很漂亮')
By.xpath("//input[contains(@id,'那么美')]")

 

本文转自:

http://www.cnblogs.com/sqlnew/archive/2006/08/17/479869.aspx

http://www.tuicool.com/articles/nI7R7bf

相关文章
相关标签/搜索