更多: RPA进阶:XPath基础,用XPath选择元素 (eryoude.com)
来源: XPath 教程 (w3school.com.cn)
什么是 XPath?
- XPath 是一门在 XML 文档中查找信息的语言。
- XPath 使用路径表达式在 XML 文档中进行导航
- XPath 包含一个标准函数库
- XPath 是 XSLT 中的主要元素
- XPath 是一个 W3C 标准
节点
术语
节点(Node)
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。
XML 文档是被作为节点树
来对待的。树的根被称为文档节点或者根节点
。
基本值(Atomic value)
无父或无子的节点:J K. Rowling、"en"。
项目(Item)
项目是基本值或者节点
节点关系
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
父(Parent)
book 元素是 title、author、year 以及 price 元素的父元素。
子(Children)
title、author、year 以及 price 元素都是 book 元素的子元素。
同胞(Sibling)
拥有相同的父的节点,title、author、year 以及 price 元素都是同胞元素。
先辈(Ancestor)
某节点的父、父的父等等,title 元素的先辈是 book 元素和 bookstore 元素。
后代(Descendant)
某个节点的子,子的子等等,bookstore 的后代是 book、title、author、year 以及 price 元素。
语法
<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>
选取节点
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
路径表达式 | 结果 |
---|---|
bookstore | 选取 bookstore 的所有子节点 |
/bookstore | 选取根元素 bookstore |
bookstore/book | 选取 bookstore 子元素的所有 book 元素 |
//book | 选取所有 book 子元素,不管它在文档中的位置 |
bookstore//book | 选择 bookstore 元素的后代的所有 book 元素,不管位于 bookstore 之下的什么位置 |
//@lang | 选取名为 lang 的所有属性 |
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中
。
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 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>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35 |
/bookstore/book[price>35.00]/title | 选取 bookstore 中的 book 的所有 title ,且其中的 price 元素的值须大于 35 |
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取 book 元素的所有 title 和 price 元素。 |
//title | //price | 选取文档中的所有 title 和 price 元素。 |
/bookstore/book/title | //price | 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。 |
轴(Axes)
<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>
XPath 轴
轴可定义相对于当前节点的节点集。
ancestor
先辈(父、祖父等)ancestor-or-self
先辈(父、祖父等)+自己attribute
自己(当前节点)child
子节点descendant
后代元素(子、孙等)descendant-or-self
后代元素(子、孙等)+自己following
自己之后的所有节点namespace
自己的所有命名空间节点parent
父节点preceding
自己之前的所有节点preceding-sibling
自己之前的所有同级节点self
当前节点
位置路径表达式
绝对位置路径: /step/step/...
相对位置路径: step/step/...
步的语法: 轴名称::节点测试[谓语]
实例
例子 | 结果 |
---|---|
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 孙节点。 |
运算符
|
计算两个节点集+
加法-
减法*
乘法div
除法=
等于!=
不等于<
小于<=
小于或等>
大于>=
大于或等于or
或and
与mod
计算除法的余数
例子
通过属性查找:通过class=abc查找a标签
//a[@class="abc"]
通过文本值查找:通过文本值=首页查找a标签
//a[text()="首页"]
通过模糊查询属性或者文本属性:通过模糊查询属性和值获取a标签
//a[contains(@class, abc)]
//a[contains(text(), "首页")]
通过属性的开头查询属性或者文本:
//a[starts-with(@class, abc)]
//a[starts-with(text(), "首页")]
//div/a[starts-with(@class, mnav)]
通过父级查找:先找元素的兄弟span,再找到父级,再定位到要找的元素a。
//span/../a[2]
用and多个条件查找:
//[@class="nav" and @type="password"]
svg格式查找:
//[name()="svg"]
Other
/html/body/div/div/span
*
表示全部
/html/body//div/*
div下全部标签
.
表示当前节点
[3]
表示位置标签,表示第3个标签(从1开始非0)
[last()]
表示最后一个(不能用-1)
[last()-1]
表示倒数第二个
[postion()<4]
位置元素,表示前面3个标签
//*[@id="s-top-left"]/a[3]
..
表示当前节点的父节点
//*[@id="s-top-left"]/a[3]
菜单中的一个新闻
//*[@id="s-top-left"]/a[3]/..
全部菜单
通过类和id查找:
/html/body//div/span[@id]
/html/dody//div/span[@id = text]
通过文本属性查找:
/html/dody//div/span[text()="设置"]
支持运算符:
|
连接多个表达式;
or
连接多个条件;