XPath是什么?

  • XPath代表XML路径语言
  • XPath使用“类似路径”的语法来标识和导航XML文档中的节点
  • XPath包含200多个内置函数
  • XPath是XSLT标准中的一个主要元素
  • XPath是W3C的推荐

XPath路径表达式

XPath使用路径表达式来选择XML文档中的节点或节点集。这些路径表达式非常类似于传统计算机文件系统中使用的路径表达式。

XPath标准函数

XPath包含200多个内置函数。有用于字符串值,数字值,布尔值,日期和时间比较,节点操作,序列操作等的功能。今天,XPath表达式也可以用于JavaScript,Java,XML Schema,PHP,Python,C和C ++,以及许多其他语言。

XPath节点

XPath术语

节点

在XPath中,有七种节点:元素,属性,文本,名称空间,处理指令,注释和文档节点。XML文档被视为节点树。树的最顶端的元素叫做根元素。请看下面的XML文档:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?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>

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

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

原子值

原子值是没有子节点或父节点的节点。原子值的例子:

1
2
J K. Rowling
"en"

项目

项目是原子值或节点。

节点关系

父节点

每个元素和属性都有一个父节点。在上面的例子中,book元素是title,author,year和price的父节点。

子节点

元素节点可以有零个、一个或多个子节点。在上面的例子中,title,author,year和price都是book元素的子节点。

兄弟节点

具有相同父节点的节点。 在上面的例子中,title,author,year和price都是兄弟节点。

祖先节点

节点的父节点、父节点的父节点等。在上面的例子中,book元素和bookstore元素是title的祖先节点。

后代节点

节点的子节点、子节点的子节点等。在上面的例子中,book,title,author,year和price都是bookstore元素的后代节点。

XPath语法

XML示例文档

在以下的例子中,我们将使用下面的XML文档。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book>
        <title lang="en">Harry Potter</title>
        <price>29.99</price>
    </book>
    <book>
        <title lang="en">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>

选择节点

XPath使用路径表达式来选择XML文档中的节点。节点是按照路径或步骤选择的。下面列出了最有用的路径表达式:

表达式 描述
nodename 选择所有名字为“nodename”的节点
/ 选择根节点开始的某个节点
// 选择任意位置的某个节点
. 选择当前节点
.. 选择当前节点的父节点
@ 选择某个属性

在下表中,我们列出了一些路径表达式和表达式的结果:

路径表达式 结果
bookstore 选择所有名字为"bookstore"的节点
/bookstore 选择根节点bookstore,这是绝对路径写法
bookstore/book 选择所有属于bookstore子节点的book元素,这是相对路径的写法
//book 选择所有book元素,不管它们在文档中的位置
bookstore//book 选择所有属于bookstore元素后代的book元素,不管它们位于bookstore之下的什么位置
//@lang 选择所有名为lang的属性

谓词

谓词用于查找特定节点或包含特定值的节点。谓词总是嵌入在方括号中。在下表中,我们列出了一些带有谓词的路径表达式以及表达式的结果:

路径表达式 结果
/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='en’] 选择所有lang属性值为"en"的title节点
/bookstore/book[price] 选择bookstore的所有book子元素,且book元素必须带有price子元素
/bookstore/book[price>35.00] 选择bookstore的所有book子元素,且book元素的price子元素值必须大于35
/bookstore/book[price>35.00]/title 选择所有上例中的title元素
/bookstore/book/price[.>35.00] 选择所有大于35的”/bookstore/book"的price子元素

选择未知节点

XPath通配符可用于选择未知的XML节点。

通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点

在下表中,我们列出了一些路径表达式和表达式的结果:

路径表达式 结果
//* 选择所有元素节点
/*/* 选择所有第二层的元素节点
/bookstore/* 选择bookstore的所有元素子节点
//title[@*] 选择所有带有属性的title元素

选择多个路径

通过在XPath表达式中使用|操作符,你可以选择多个路径。在下表中,我们列出了一些路径表达式和表达式的结果:

路径表达式 结果
//book/title | //book/price 选择所有book元素的所有title子元素和所有price子元素
//title | //price 选择所有title元素和所有price元素

XPath轴

轴表示与当前节点的关系,用于定位树中相对于当前节点的节点。

轴名字 结果
ancestor 选择当前节点的所有祖先节点
ancestor-or-self 选择当前节点的所有祖先节点或自己
attribute 选择当前节点的所有属性
child 选择当前节点的所有子节点
descendant 选择当前节点的所有后代节点
descendant-or-self 选择当前节点的所有后代节点或自己
following 选择当前节点的结束标记之后的文档中的所有内容
following-sibling 选择当前节点之后的所有兄弟节点
namespace 选择当前节点的所有名称空间节点
parent 选择当前节点的父节点
preceding 选择在当前节点之前的所有节点,除了祖先节点、属性节点和名称空间节点
preceding-sibling 选择当前节点之前的所有兄弟节点
self 选择当前节点

位置路径表达式

位置路径可以是绝对路径或相对路径。绝对位置路径以/开头,而相对位置路径则不是。这两种情况下,位置路径都包含一个或多个步骤,每个步骤之间都用斜杠分隔:

1
2
/step/step/...
step/step/...

每个步骤都根据当前节点集中的节点进行计算。 一个步骤包括:

  • 轴(定义所选节点和当前节点之间的树关系)
  • 节点测试(标识轴内的节点)
  • 零个或多个谓词(进一步优化所选节点集)

步骤的语法是:

1
axisname::nodetest[predicate]

例子

例子 结果
child::book 选择所有是当前节点子节点的book节点
attribute::lang 选择当前节点的lang属性
child::* 选择当前节点的所有元素子节点
attribute::* 选择当前节点的所有属性
child::text() 选择所有是当前节点子节点的text类型节点
child::node() 选择当前节点的所有子节点
descendant::book 选择当前节点的所有book后代节点
ancestor::book 选择当前节点的所有book祖先节点
ancestor-or-self::book 选择当前节点的所有book祖先节点或者自己是book节点
child::*/child::price 选择当前节点的所有price孙子节点

XPath运算符

XPath表达式返回节点集,字符串,布尔值或数字。 以下是可在XPath表达式中使用的运算符的列表:

运算符 描述 例子
| 计算两个节点集 //book | //cd
+ 加法 6 + 4
- 减法 6 - 4
* 乘法 6 * 4
div 除法 8 div 4
= 相等 price=9.80
!= 不等 price!=9.80
< price<9.80
<= 小于或等于 price<=9.80
> 大于 price>9.80
>= 大于或等于 price>=9.80
or 逻辑或 price=9.80 or price=9.70
and 逻辑与 price>9.00 and price<9.90
mod 取模 5 mod 2