XPath基础知识

自学XPath的一些基础知识

1.XPath的节点
XPath有7中类型节点:元素,属性,文本,命名空间,处理指令,注释以及文档(根)节点
<?xml version="1.0" encoding="UTF-8"?>

<bookstore>(文档节点)
<book>
<title lang="en"(属性节点)(基本值:无子节点)>Harry Potter</title>
<author>J K. Rowling</author>(元素节点)(基本值:无子节点)
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
基本值:无父或无子的节点
节点关系:
父(每个元素和属性都有父)
子(元素节点可为0,1或多个)
同胞(拥有相同父节点)
先辈:某节点的父,父的父
后代:某节点的子,子的子

2.XPath的语法
<?xml version="1.0" encoding="UTF-8"?>

<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>

选取节点
1)nodename 选取此节点的所有子节点
bookstore
2)/从根节点选取
/bookstore 选取根元素bookstore
bookstore/book选取属于bookstore的子元素的所有book元素
注释:路径起始于/说明是绝对路径,起始于//说明是相对路径
3)//从匹配选择的当前节点选择文档中的节点而不考虑它们的位置
//book选择所有book元素
bookstore//book 选取bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置
4).选取当前节点
./bookstore 选取bookstore节点
5)..选取当前节点的父节点
../book 选取book节点的父节点bookstore
6)@ 选取属性
//@lang 选取名为 lang 的所有属性

谓语(Predicates)
1)//bookstore/book[1] 选取bookstore的第一个book元素
2)//bookstore/book[last()] 选取bookstore最后一个book元素
3)//bookstore/book[last(-1)] 选取bookstore倒数第二个book元素
4)//bookstore/book[position()<2] 选取bookstore元素的子元素中前两个book元素
5)//title[@lang] 选取所有拥有名为lang属性的title元素
6)//title[@lang='eng'] 选取所有拥有名为lang属性且属性值为eng的title元素
7)/bookstore/book[price>35.00] 选取bookstore元素下所有price>35的book元素
8)/bookstore/book[price>35.00]/title 选取bookstore元素下price>35的book子元素下的title元素

选取未知节点
1)*匹配任何元素节点
/bookstore/* 选取bookstore元素的所有子元素
//* 选取文档中的所有元素
2)@* 匹配任何属性节点
//title[@*] 选取所有带有属性的title元素
3) node() 匹配任何类型节点

选取若干路径
1)//book/title|//book/price 选取book元素的所有title元素和price元素
2)//title|//price 选取文档中所有的title元素和price元素
3)/bookstore/book/title|//price 选择属于bookstore元素的book元素的title元素和文档中所有的price元素

3.XPath的轴(Axes)
轴可以定义相对于当前节点的节点集
------------------------------------------------------------------------------------------------------------------
轴名称             结果
------------------------------------------------------------------------------------------------------------------
ancestor       选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self    选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute        选取当前节点的所有属性。
child         选取当前节点的所有子元素。
descendant       选取当前节点的所有后代元素(子、孙等)。
descendant-or-self    选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following       选取文档中当前节点的结束标签之后的所有节点。
following-sibling     选取当前节点之后的所有兄弟节点
namespace       选取当前节点的所有命名空间节点。
parent          选取当前节点的父节点。
preceding          选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling   选取当前节点之前的所有同级节点。
self         选取当前节点。

4.XPath运算符
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
运算符   描述         实例                 返回值
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|      计算两个节点集    //book | //cd           返回所有拥有 book 和 cd 元素的节点集
+     加法         6 + 4            10
-      减法         6 - 4            2
*      乘法        6 * 4            24
div     除法         8 div 4             2
=     等于        price=9.80              如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。
!=      不等于        price!=9.80            如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
<    小于        price<9.80              如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
<=    小于或等于     price<=9.80            如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
>      大于         price>9.80             如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
>=      大于或等于       price>=9.80             如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。
or      或         price=9.80 or price=9.70      如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。
and     与          price>9.00 and price<9.90    如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。
mod    计算除法的余数    5  mod 2 1


5.Xpath的优缺点
•缺点
1)性能差,因为使用这种方式进行定位,webdriver会将整个页面的所有元素进行扫描来找到我们所需的元素,所以当脚本中大量使用XPath方式定位,会大大降低脚本的执行速度。
2)Xpath会随着页面的布局的改变而改变,几乎不能维护
•优点
1)可以做布尔逻辑判断,例如//*[@id="kw" and @name="wd"]
2)可以进行模糊定位,contains(),start-with(),ends-with()等

  

猜你喜欢

转载自www.cnblogs.com/daisyatcnblog/p/12333411.html