Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

xpath学习笔记

xpath简介

什么是 XPath?

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

Xpath 节点

节点(Node)

Xpath中共7种节点:

  1. 元素
  2. 属性
  3. 文本
  4. 命名空间
  5. 处理指令
  6. 注释
  7. 文档(根)节点

XML文档被作为节点树对待,树的根被成为文档(根)节点

例如如下XML文档:

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>

</bookstore>

上面的XML文档中的节点例子:

1
2
3
<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)

基本值(Atomic Value)

也可成为原子值,即无父或无子的节点,例如:

1
2
J K. Rowling
"en"

项目(Item)

项目是基本值或者节点

双亲(Parent)

每个元素以及属性都有一个双亲

如例中的booktitleauthoryear以及price的双亲

子(Children)

元素节点可能有0,1或多个子

如例中的titleauthoryearprice元素均为book的子

同胞(Sibling)

拥有相同双亲节点的元素节点

如例中,titleauthoryear 以及 price 元素都是同胞

先辈(Ancestor)

某节点的双亲、双亲的双亲,等等。

如例中,title 元素的先辈是 book 元素和 bookstore 元素

后代(Descendant)

某个节点的子,子的子,等等。

如例中,bookstore 的后代是 booktitleauthoryear 以及 price 元素

Xpath语法

选取节点

XPath使用路径表达式在XML文档中匹配节点:

表达式 描述
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 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

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 元素。

XPath轴(Axes)

轴可定位为相对于当前节点的节点集:

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

位置路径表达式

位置路径可以绝对的,也可以是相对的。

绝对路径一定其实于/,而相对路径则不会。

位置路径包括一个或多个步,每个步被斜杠划分开:

绝对位置路径:

1
/step/step/...

相对位置路径:

1
step/step/...

在相对路径中,每个步均根据当前节点集之中的节点来进行计算。

步(step)

步可以是:

  1. 轴(axis)——定义所选节点与当前节点之间的树关系
  2. 节点测试(node-test)——识别某个轴内部的节点
  3. 零个或者更多谓词(predicate)——更深入地提炼所选的节点集

由此可推导出步的语法:

1
轴名称::节点测试[谓词]

例如:

例子 结果
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表达式可返回节点集,字符串、逻辑值,以及数字。这些返回子也可以进行一些运算,例如:

运算符 描述 实例 返回值
| 计算两个节点集 //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或9.70,则返回 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

评论