该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!
Selenium WebDriver中有关元素定位的学习,需要XPath的支持,特此梳理;
前言
XPath是一门在XML文档中查找信息的语言;
XPath可用来在XML文档中对元素和属性进行遍历;(是W3C XSLT标准的主要元素)
对XPath的理解是很多高级XML应用的基础;
最后我们还会附XPath2.0内置函数(链接),以便查阅;
主要内容目录:
1.XPath简介:XPath的概念;
2.XPath节点:详细介绍XPath中不同类型的节点,以及节点之间的关系;
3.XPath语法:讲解XPath语法;
4.XPath轴:XPath axes(轴);
5.XPath运算符:列出了可以用于XPath表达式的运算符;
6.XPath实例:使用books.xml演示一些XPath实例;
7.XPath摘要:知识点总结,及下一步学习内容推荐;
一、XPath简介
XPath是一门在XML文档中查找信息的语言;
XPath用于在XML文档中通过元素和属性进行导航;
学习前应简单了解:HTML/XHTML、XML/XML命名空间;
什么是XPath:
1)XPath使用路径表达式在XML文档中进行导航;
2)XPath包含一个标准函数库;
3)XPath是XSLT中的主要元素;
4)XPath是一个W3C标准;
XPath路径表达式:
XPath使用路径表达式来选取XML文档中的节点或者节点集;
这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似;
XPath标准函数:
XPath含有超过100个内建函数;
这些函数用于字符串值、数值、日期和时间比较;节点和QName处理、序列处理、逻辑值等等;
XPath在XSLT中使用:
XPath是XSLT标准中的主要元素;(感兴趣的同学可自行查阅)
XPath是W3C标准:
XPath于1999.11.16成为W3C标准;
XPath被设计为供XSLT,XPointer以及其他XML解析软件使用;
二、XPath节点
在XPath中,有7种类型的节点:
元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点);
XPath术语
1)节点(Node)
在XPath中,有7种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点;
XML文档是被作为节点树来对待的;
树的根被称为文档节点或者根节点;
后续我们会一一见到相应的示例;
这里简单看下:(XML2-1)
<bookstore>#文档节点(最外层节点)
<book>
<title lang=“ch">鬼吹灯</title>#lang=“ch”是属性节点
<year>2018</year>#元素节点
</book>
</bookstore>
2)基本值(或称原子值,Atomic value)
基本值是无父或无子的节点;
3)项目(Item)
项目是基本值或者节点;
节点关系
1)父(Parent)
每个元素以及属性都有一个父;(上述示例中book元素就是title和year元素的父)
2)子(Children)
元素节点可有0个、1个或多个子;(上述示例中title和year元素都是book元素的子)
3)同胞(Sibling)
拥有相同的父的节点;(在上述示例中,title和year都是同胞)
4)先辈(Ancestor)
某节点的父、父的父,等等;(上述示例中,title元素的先辈是book和bookstore元素)
5)后代(Descendant)
某个节点的子,子的子,等等;(上述示例中,bookstore 的后代是book、title以及year)
三、XPath语法
XPath使用路径表达式来选取XML文档中的节点或节点集;
节点是通过沿着路径(path)或者步(steps)来选取的;
XML示例:(XML3-1)
<?xml version=“1.0” encoding=“ISO-8859-1”?>
<bookstore>
<book>
<title lang=‘eng’>射雕英雄传</title>
<price>10.0</price>
</book>
<book>
<title lang=‘ch’>天龙八部</title>
<price>12.0</price>
</book>
</bookstore>
接下来,我们基于这个示例来熟悉和学习XPath的语法;
选取节点
XPath使用路径表达式在XML文档中选取节点;节点是通过沿着路径或者step来选取的;
路径表达式组成部分示意:
1)nodename:选取此节点的所有子节点;
2)/ :从根节点选取;
3)// :从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置;
4). :选取当前节点;
5).. :选取当前节点的父节点;
6)@ :选取属性;
对于上述示例:
bookstore:表示bookstore元素的所有子节点;
/bookstore:选取根元素bookstore;(如果路径起始于正斜杠’/‘,则此路径始终代表到某元素的绝对路径)
bookstore/book:选取属于bookstore的子元素的所有book元素;
//book:选取所有book子元素,而不管它们在文档中的位置;
bookstore//book:选择属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置;
//@lang:选取名为lang的所有属性;
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值得节点;
谓语被嵌在方括号【】中;
带有谓语的一些路径表达式示例:
/bookstore/book[1] :选取属于bookstroe子元素的第一个book元素;
/bookstore/book[last()] :选取属于bookstore子元素的最后一个book元素;
/bookstore/book[last()-1] :选取属于bookstore子元素的倒数第二个book元素;
/bookstore/book[position()<3] :选取最前面的两个属于bookstore元素的子元素的book元素;
//title[@lang] :选取所有拥有名为lang的属性的title属性;
//title[@lang=‘eng’] :选取所有title元素,且这些元素拥有值为eng的lang属性;
/bookstore/book[price>11.0] :选取bookstore元素的所有book子元素,且其中price元素的值必须大于11.0;
/bookstore/book[price>11.0]/title :选取bookstore元素的所有book元素的所有title子元素,且其中book元素的price子元素的值必须大于11.0;
选取未知节点:
XPath通配符可用来选取未知的XML元素;
部分通配符示意:
*:匹配任何元素节点
@*:匹配任何属性节点
node():匹配任何类型的节点
一些使用通配符的路径表达式示意:
/bookstore/* :选取bookstore元素的所有子元素;
//* :选取文档中的所有元素;
//title[@*] :选取所有带有属性的title元素;
注意:
下标选取是从1开始的,这是W3C的标准,当然个别浏览器可能支持从0开始的;
用做选取的路径表达式的绝对路径都是以/或//开头的;
选取若干路径
通过在路径中使用’|’运算符,你可以选取若干路径;
一些使用|运算符的路径表达式示例:
//book/title | //book/price :选取book元素的所有title和price元素
//title | //price :选取文档中的所有title和price元素;
/bookstore/book/title | //price :选取属于bookstore元素的book元素的所有title元素,以及文档中所有的price元素;
四、XPath Axes(轴)
我们仍然使用XML3-1的XML示例进行讲解;
XPath轴
轴可定义相对于当前节点的节点集;
轴名称及示意
ancestor:选取当前节点的所有先辈(父、祖父等);
ancestor-or-self:选取当前节点的所有先辈(父、祖父等),以及当前节点本身;
attribute:选取当前节点的所有属性;
child:选取当前节点的所有子元素;
descendant:选取当前节点的所有后代元素(子、孙等);
descendant-or-self:选取当前节点的所有后代元素(子、孙等),及当前节点本身;
following:选取文档中当前节点的结束标签之后的所有节点;
namespace:选取当前节点的所有命名空间节点;
parent:选取当前节点的父节点;
preceding:选取文档中当前节点的开始标签之前的所有节点;
preceding-sibling:选取当前节点之前的所有的同级节点;
self:选取当前节点;
位置路径表达式:
位置路径可以是绝对的,也可以是相对的;
绝对路径起始于正斜杠(/),而相对路径不会这样;在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割;
绝对位置路径:
/step/step/…
相对位置路径:
step/step/…
每个步 均根据当前节点集之中的节点来进行计算;
步(step)包括:
1)轴(axis)
定义所选节点与当前节点之间的树关系;
2)节点测试(node-test)
识别某个轴内部的节点;
3)零个或者更多谓词(predicate)
更深入的提炼所选的节点集;
步的语法:
轴名称::节点测试[谓词]
一些使用步语法的示例:
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运算符
XPath表达式可返回节点集、字符串、逻辑值以及数字;
XPath运算符
下列是可用在XPath表达式中的运算符:
| -> 计算两个节点集 -> //book | //cd -> 返回所有拥有book和cd元素的节点集;
+ ->加法->数字计算返回数字
- ->减法->数字计算返回数字
* ->乘法->数字计算返回数字
div ->除法->数字计算返回数字
mod ->计算除法的余数->数字计算返回数字
= ->等于->比较运算 返回bool值 true或false
!= ->不等于->比较运算 返回bool值 true或false
< ->小于->比较运算 返回bool值 true或false
<= ->小于或等于->比较运算 返回bool值 true或false
> ->大于->比较运算 返回bool值 true或false
>= ->大于或等于->比较运算 返回bool值 true或false
or ->或->逻辑运算 返回bool值 true或false
and ->与->逻辑运算 返回bool值 true或false
六、XPath实例
我们使用了w3school上的原版示例books.xml并做了些许名称变更;
XML示例:(XML6-1)
<?xml version=“1.0” encoding=“ISO-8859-1”?>
<bookstore>
<book category=“厨房”>
<title lang=‘en’>厨房攻略1</title>
<author>周大厨</author>
<year>2018</year>
<price>10.0</price>
</book>
<book category=“传记”>
<title lang=‘en’>中华传记1</title>
<author>党和人民</author>
<year>2018</year>
<price>11.0</price>
</book>
<book category=“历史” cover=“古代史">
<title lang=‘en’>宋史</title>
<author>党和人民</author>
<year>2018</year>
<price>12.0</price>
</book>
<book category=“历史”>
<title lang=‘en’>近现代史</title>
<author>党和人民</author>
<year>2018</year>
<price>10.0</price>
</book>
</bookstore>
获取所有title:
/bookstore/book/title
获取第一个book的title:
/bookstore/book[1]/title
选取所有的价格(旨在选取price节点中的所有文本):
/bookstore/book/price/text()
选取价格高于10的price节点、title节点:
/bookstore/book[price > 10.0]/price
/bookstore/book[price > 10.0]/title
七、XPath总结
XPath是我们了解如何在XML中查找信息;
学习了XPath,还可以继续学习XSLT、XQuery、XLink以及XPointer;
鉴于这些和我们学习的Selenium WebDriver无太大关系,这里只做简单说明;
XSLT:针对XML文件的样式表语言;
XQuery:和XML数据查询有关;
XLink和XPointer:XML中的链接表示;