选取节点
XPath 使用路径表达式来选取 XML或HTML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
下面列出了最常用的路径表达式:
表达式 |
描述 |
nodename |
选取此节点的所有子节点。 |
/ |
从根节点选取。 |
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. |
选取当前节点。 |
.. |
选取当前节点的父节点。 |
@ |
选取属性。要加上中括号 |
例如:
|
路径表达式 |
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.00。 |
/bookstore/book[price>35.00]/title |
选取 bookstore 元素中的 book 元素的所有 title 元素,且book元素其中的 price 元素的值须大于 35.00。 |
选取未知节点
XPath 通配符可用来选取未知的 XML 元素。
通配符 |
描述 |
* |
匹配任何元素节点。 |
@* |
匹配任何属性节点。需要结合其他使用。 |
node() |
匹配任何类型的节点。 |
例如
/bookstore/* |
选取 bookstore 元素的所有子元素。 |
//* |
选取文档中的所有元素。 |
//title[@*] |
选取所有带有属性的 title 元素。 |
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
//title | //price |
选取文档中的所有 title 和 price 元素。 |
XPath 轴
轴可定义相对于当前节点的节点集。
表达式 |
描述 |
用法 |
说明 |
ancestor |
选取当前节点的所有先辈(父、祖父等) |
//div[@id=’123’]/ancestor::* |
选择标签为div且ID号为123的所有先辈标签 |
ancestor-or-self |
选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
//div[@id=’123’]/ancestor-or-self::* |
选择标签为div且ID号为123的所有先辈标签且包含自己 |
attribute |
选取当前节点的所有属性 |
//div[@id=’123’]/attribute::class |
选择标签为div且ID号为123的类属性名称 |
child |
选取当前节点的所有子元素 |
//div[@id=’123’]/child::book |
选择标签为div且ID号为123的所有子元素的为book 节点 |
descendant |
选取当前节点的所有后代元素(子、孙等) |
./descendant::* |
返回当前节点的所有后代节点(子节点、孙节点) |
following |
选取文档中当前节点结束标签后的所有节点 |
./following::* |
选取文档中当前节点结束标签后的所有节点 |
parent |
选取当前节点的父节点 |
./parent::* |
选取当前节点的父节点 |
preceding |
选取文档中当前节点的开始标签之前的所有节点 |
//div[@id=’123’]/preceding::* |
选择标签为div且ID号为123的开始标签之前的所有节点 |
preceding-sibling |
选取当前节点之前的所有同级节点 |
//div[@id=’123’]/preceding-sibling::* |
选择标签为div且ID号为123的之前的所有同级节点 |
self |
选取当前节点 |
./self::* |
选取当前节点 |
表达式 |
描述 |
用法 |
说明 |
+ |
加法 |
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 |
使用功能函数能够更好的进行模糊搜索
表达式 |
描述 |
用法 |
说明 |
starts-with |
选取id值以ma开头的div节点 |
//div[starts-with(@id,”ma”)] |
选取id值以ma开头的div节点 |
contains |
选取id值包含ma的div节点 |
//div[contains(@id,”ma”)] |
选取id值包含ma的div节点 |
and |
选取id值包含ma和in的div节点 |
//div[contains(@id,”ma”) and contains(@id,”in”)] |
选取id值包含ma和in的div节点 |
text() |
选取节点文本包含ma的div节点 |
//div[contains(text(),”ma”)] |
选取节点文本包含ma的div节点 |