XPath指南
author: zhangjunhd@gmail.com 06-12-17
Blog: http://blog.csdn.net/zhangjunhd/
XPath 是用于在 XML 文件上寻找信息的一种语言。 XPath 用于操纵 XML 文件上的元素和属性。
1 .什么是可扩展路径( XPath )?
XPath 是 XML 中的一种语法。 XPath 是 XML 文档中的路径索引。 XPath 包含一个标准函数库。 XPath 是一个 XSLT 的主要元素。 XPath 是 W3C 标准。
XPath 路径表达式用于从 XML 文档中选取节点或节点设置。这些语句类似于传统操作系统的语句。 XPath 包含 100 多种内置函数。包括:字符值,数字值, 日期和时间方法,节点操作,排序操作,布尔值等。 XPath 是 XSLT 标准的一个重要元素。在创建 XSLT 文档前你必须先了解 XPath 。 XQuery 和 XPointer 都是基于 XPath 表达式构建的。它们有着相同的数据模式并支持相同的函数和操作。 XPath 在 1999 年 11 月 16 日 成为 W3C 标准。
2 . XPath Nodes( 节 点 )
2.1 XPath 术语
2.1.1 节点( Nodes )
在 XPath 里,有 7 中不同的节点:元素( element ),属性( attribute ),文本( text ),名称空间( namespace ),处理指令( processing-instruction ),内容( comment ),文档(根)( document (root) )节点, XML 文档是节点树状结构。 “ 树根 ” 称作文档节点(或根节点)。
下面给出一 个 XML 文档:
<?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 文档中的节点实例:
<bookstore> (document node)
<author>J K. Rowling</author> (element node)
lang="en" (attribute node)
2.1.2 原子值( Atomic values )
原子值是那些没有子或父的节点(无上下关系)。 “ 单元素( Atomic ) ” 属性值例子:
J K. Rowling
"en"
2.1.3 项目( Items )
项目是指原子值或节点。
2.2 节点间的关系
示例:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
2.2.1 父类( Parent )
每个元素和属性都有一个 “ 父类 ” 。 在示例里: book 元素是 title, author, year, 和 price 元素的父元素。
2.2.2 子 类( Children )
节点元素可拥有任意个数的子类。在示例里, title, author, year, 和 price 元素都是 book 元素的子元素。
2.2.3 兄弟类( Siblings )
拥有相同的父类的节点称之为兄弟类。在示例里 title, author, year, 和 price 元素都是 “ 兄弟类元素 ” 。
2.2.4 祖 先类( Ancestors )
一个节点的父类,父类的父类及更多称为该节点的祖类。在示例里, title 元素的祖先类元素是 book 元素和 bookstore 元素。
2.2.5 子孙类( Descendants )
节点的子类,子类的子类及更多称为子孙类。在示例里, bookstore 元素的子孙类元素是 book, title, author, year, 和 price 元素。
3 . XPath 语法
XPath 通过路径表达式从 XML 文档中选取节点或节点设置。可以通过 一条语句或相应的步骤选取一个节点。
3.1 XML 文档实例
我们将在接下来的文章中引用这个 XML 文档:
<?xml version="1.0" encoding="ISO-8859-1"?>
<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>
3.2 选取节点
XPath 通过路径表达式在 XML 文档中选取节点。可以通过一条语句或相应的步骤选取一个节点。下面列出了最常使用的路径表达式:
表达式 | 注释 |
nodename | 选取节 点下的所有子节点 |
/ | 选取根 节点 |
// | 选取文档中所有符合条件的节点,不管该节点位于何处 |
. | 选取当 前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属 性 |
在下面的表格中,我们列出了一些路径表达式及其运行的结果:
表达式 | 结果 |
bookstore | 选取 bookstore 元素的所有子节点 |
/bookstore | 选取 bookstore 元素的根节点 注意:如果一个路径以( / )开始,那么它必须是表述该元素所在的绝对路径 |
bookstore/book | 选取bookstore 中的所有book 子元素 |
//book | 选取 文档中的所有book 元素 |
bookstore//book | 选取文档中所有处于bookstore 节点下 的book 元素 |
//@lang | 选取 所有lang 属性 |
3.3 谓 词
谓语用来指定节点所含有的特殊的值。通常使用方括号 [ ] 来指定谓词。在下面的表格中我们列出了一些谓词表达式及其运行结果:
表达式 | 结果 |
/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'] | 选取所有lang 属性值为‘eng’ 的title 元素 |
/bookstore/book[price>35.00] | 选取bookstore 节点下的所有包含price 元素大于35.00 的book 元素 |
/bookstore/book[price>35.00]/title | 选取bookstore 节点下的所有包含price 元素大于35.00 的book 节点下的title 元素 |
3.4 选取未知节点
可以通过 XPath 通配符选取未知的 XML 元素。
通配符 | 注释 |
* | 匹配任 意的节点元素 |
@* | 匹配任 意的节点属性 |
node() | 匹配 任意种类的节点 |
在下面的表格中我们列出了一些表达式及其运行结果:
表达式 | 结果 |
/bookstore/* | 选取bookstore 节点中的任意子节点元 素 |
//* | 选取文档中的所有元素 |
//title[@*] | 选取包含任意属性的title 元素 |
3.5 选取多个路径
你可以同过在表达式中添加 | 来选取多个路径。在下面的表格中我们列 出了一些表达式及其运行结果:
表达式 | 结果 |
//book/title | //book/price | 选取book 节点中的所有title 和price 元素 |
//title | //price | 选取文 档中的所有title 和price 元素 |
/bookstore/book/title | //price | 选取bookstore 节点下的book 节点中的所有title 元素和文档中所有的price 元素 |
4 . XPath Axes
我们将在下文中引用 3.1 XML 文档实例
4.1XPath 轴( Axes )
轴用于定义与当前节点相关的属性。
轴名称 | 结果 |
ancestor | 选取当前节点的祖类(父类,父类的父类及更多) |
ancestor-or-self | 选取当前节点的祖类(父类,父类的父类及更多)和节点自身 |
attribute | 选取当前节点的所有属性 |
child | 选取 当前节点的所有子类 |
descendant | 选取当前节点的所有子孙类(子类,子类的子类及更多) |
descendant-or-self | 选取当前节点的所有子孙类(子类,子类的子类及更多)和节点自身 |
following | 选取文档中当前节点结束标签前的所有元素 |
following-sibling | 选取位于当前节点后的所有兄弟类节点 |
namespace | 选取所有当前节点的命名空间 |
parent | 选取 当前节点的父节点 |
preceding | 选取文档中所有位于当前节点开始标签前的元素 |
preceding-sibling | 选取位于当前节点前的所有兄弟类节点 |
self | 选取当 前节点 |
4.2 路径表达式
路径表达式可以使用绝对路径也可以是相对路径。绝对路径表达式以( / )开始,两种路径表达式都包含一个或多个 层次,用 / 分 隔:
An absolute location path:
绝对路径:
/step/step/...
A relative location path:
相对路径:
step/step/...
每个层次都对应当前节点的一个属性。层包括:
◆层路径(取决于目标节点与当前节点间的目录 关联)
◆节点测试(确认节点包含此属性)
◆无条件或条件(进一步检索节点属性)
选取的语法为:
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 元素 |
5 . XPath 操作符
XPath 表达式返回值可以是:节点属 性,字符型,布尔型,数字型。下面给出了 XPath 表达式所支持的所有操作符:
操作符 | 注释 | 实例 | 返回值 |
| | 连接两条语句 | //book | //cd | 返回所有book 和cd 的节点属性 |
+ | 加 | 6 + 4 | 10 |
- | 减 | 6 - 4 | 2 |
* | 乘 | 6 * 4 | 24 |
div | 除 | 8 div 4 | 2 |
= | 等 | price=9.80 | 返回true 或false |
!= | 不等 | price!=9.80 | 返回true 或false |
< | 小于 | price<9.80 | 返回true 或false |
<= | 小于等于 | price<=9.80 | 返回true 或false |
> | 大于 | price>9.80 | 返回true 或false |
>= | 大于等于 | price>=9.80 | 返回true 或false |
or | or | price=9.80 or price=9.70 | 逻辑连接,判断两个条件中的一个 |
and | and | price>9.00 and price<9.90 | 逻辑连接,同时判断两个条件 |
mod | 求余 | 5 mod 2 | 1 |
6 . XPath 实例
让我们通过一些实例来学习一些基础的 XPath 语法。我们将在下面的例子中引用这个 XML 文档。 "books.xml" 文件 :
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
6.1 选取节点
我们会用 Microsoft XMLDOM object 来载入 XML 文档,用 selectNodes() 方法来从 XML 文档中选择节点。
set xmlDoc=CreateObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("books.xml")
xmlDoc.selectNodes(path expression)
6.2 选取所有 book 节点
下面的实例演示如何选取 booksotre 节点的所有 book 子元素:
xmlDoc.selectNodes("/bookstore/book")
6.3 选取第一个 book 节点
下面的例子只选择了 bookstore 节点的第一个 book 子元素:
xmlDoc.selectNodes("/bookstore/book[0]")
6.4 选取 prices
下面的例子演示了如何从 所有的 price 节 点获取文本:
xmlDoc.selectNodes("/bookstore/book/price/text()")
6.5 选取 price>35 的 price 节点
下面的例子演示了如 何选取 price 属 性值大于 35 的 title 节点:
xmlDoc.selectNodes("/bookstore/book[price>35]/title")