XPath简介
http://numenzq.javaeye.com/blog/153913
作者:曾巧(numenzq)
摘要
XPath是XML文档内容寻址语言,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT(XSL Transformations)的配套标准颁布,它也是XPointer(XML Pointer Language)的重要组成部分。
正文
在众多查询语言之中,结构化查询语言(SQL)是一种针对查询特定类型的关系库而设计和优化的语言。其他不那么常见的查询语言还有对象查询语言(OQL)和 XQuery。但本文的主题是 XPath,一种为查询 XML 文档而设计的查询语言。XPath由W3C制定的XML文档寻址标准,最近W3C发布了XPath 2.0版本并更新了文档,作为XPath 1.0超集的XPath2.0版本,它更加强大,也更加健壮,因为它支持范围更广的数据类型。这是因为XPath 2.0有效利用了XML Schema类型,而不仅是简单的字符串、数字和布尔值。XPath 2.0保持向后兼容,因此除了规范中明确说明的之外,1.0表达式在2.0中可以正常使用。
内容
l XPath概述
l XPath 1.0限制
l XPath节点
l 位置路径
l 表达式
l 函数库
l Java对XPath的支持
l 概要
XPath概述
XPath是努力给XSLT转换和XPointe的共享功能提供一个共用的句法及语义的结果。XPath的主要的目是用于对XML文档元件寻址。在支持这个主要目的的同时,它也为字符串,数字和布尔的操作提供了基本手段。XPath使用简明的、非 XML 句法以便於在URIs和XML属性值以内使用XPath,XPath对XML文档的抽象的、逻辑的结构而非它的表面句法进行操作,XPath的名字源于它在URL中用作对XML文档的层次的结构进行导航一个路径标志。
除了用做寻址外,XPath也被设计成以便它有能被用于匹配的一个自然的子集(测试一个节点是否匹配一个模式);XSLT中描述了XPath在这方面的使用。
XPath将一个XML文档建模成为一棵节点树,有不同类型的节点,包括元素节点、属性节点和正文节点。XPath定义了一种方法来计算每类的节点的字串值。一些节点的类型也有名字。XPath充分支持XML命名空间(XML namespaces)。这样,节点的名字被建模成由一个局城部分和可能为空的命名空间URI组成的对;这被称为扩展名。
XPath 1.0 限制
尽管XPath 1.0简化了许多一般的编程任务,但是,开发人员开始想要得到更多好处。XPath 1.0规范在几个领域中受到了限制或混淆,需要进行一番整改。开发人员一直致力于改进W3C,并向该语言添加了一些更为有意义的功能,其中多数功能支持对W3C XML规范的其他引申(如XML架构、XML Query 1.0以及XSLT 2.0)。
自从XPath 1.0发布以来,XML架构就成为W3C推荐项之一,并讯速定位为其他数个进行中的工作的“官方”类型系统,例如XQuery和其他与Web服务有关的工作。因为XML架构是 XML 全局中不可或缺的组成部分,所以W3C强烈希望实现类型化XPath(能够选择类型 double 的所有元素不是非常好吗?)。而且,最近有关XQuery 1.0和XSLT 2.0的工作揭示了大量的共同基础,即两种语言在其中均可以共享相同的数据模型和表达式语法的领域。这个最小公分母就变成了XPath 2.0。
XPath节点
XPath把XML文档看作是一个节点树。节点可以有不同的类型,比如元素节点或者属性节点。一些类型的节点名称由 XML 名称空间URI(允许空)和本地部分组成。
一种特殊的节点类型是根节点。一个XML文档只能有一个根节点,它是树的根,包含整个XML文档。注意,根节点包含根元素以及在根元素之前或之后出现的任何处理节点、声明节点或者注释节点。
元素节点代表XML文档中的每个元素。属性节点附属于元素节点,表示XML文档中的属性。但是,以xmlns:开始的属性在XPath中使用名称空间节点表示。其他类型的节点包括文本节点、处理指令节点和注释节点。
位置路径
位置路径是XPath中最有用也是应用最广泛的特性。位置路径是XPath表达式的特化(参见 表达式)。位置路径标识了和上下文有关的一组XPath节点。XPath定义了两种语法:简化语法和非简化语法。
本教程中只讨论简化语法,因为这种语法应用最广,而且非简化语法也更复杂。如果希望了解非简化语法,请参阅XPath 1.0规范。
位置路径有相对和绝对两种类型。
相对位置路径由使用 / 分隔的定位步序列组成。
绝对位置路径由 / 和后面可选的相对位置路径组成,其中 / 表示根节点。绝对位置路径基本上就是在根节点上下文中计算的相对位置路径。
简化语法有一些非常实用的特点:
@ 用于引用属性。
* 用于引用上下文结点的所有子元素。@* 用于引用上下文结点的所有属性。
[] 也可用于引用有序序列中的特定元素。
// 用于引用上下文节点的所有孩子。
. 用于引用上下文节点自身。
.. 用于引用上下文节点的父节点。
谓词在位置路径中用于筛选当前节点集。谓词包含一个boolean表达式(或者很容易转化成 boolean 值的表达式)。用这个布尔表达式测试当前节点集的每个成员,如果表达式成立则保留该成员否则丢弃。谓词放在一对方括号([])中。
谓词也可以使用关系运算符 >、<、>=、<= 和 !=。如您在表达式中所看到的那样,它们也可以使用布尔运算符。
表达式
布尔表达式的值只能是:真或者假。
XPath 定义了and和or运算符。对于and,首先计算左侧的操作数:如果不成立则返回false;否则计算右侧的操作数并决定表达式的结果。对于or,如果左操作数计算结果为真则表达时返回true;否则计算右操作数并决定表达式的值。
XPath 定义了以下运算符:
l = 表示“等于”
l != 表示“不等于”
l < 表示“小于”
l <= 表示“小于等于”
l > 表示“大于”
l >= 表示“大于等于”
= 运算符用于节点时,测试两个节点的值是否相等,而不论是否是同一个节点。该运算符可用于比较属性值。
XML 文档中包含 XPath 表达式时,必须遵循 XML 1.0 的结构良好性规则,任何 < 或 <= 字符必须分别用 < 和 <= 表示。比如,XPath 表达式 bidIncrement < 5 在XPointer中是合法的,但是在XSLT文档中必须写成 bidIncrement < 5。
如果布尔表达式的操作数类型不同(节点集、数字、字符串),需要进行转换,详情参见XPath 1.0规范。
XPath数字是64位双精度浮点数。XPath数字包括“非数字”NaN值、正无穷和负无穷、正零和负零。
XPath提供的数值运算符有:+(加)、-(减)、*(乘)、div(除)和mod(整除求余)。
如果需要数值运算法会把操作数转换成数字,就像使用number函数一样(参见 函数库)。
提示:减法(-)运算符的前面必须有空格,因为 XML 允许字符串中包含“-”字符。星号(*)可以被解释成通配符或者乘法字符。XPath 定义了词法规则以消除这种歧义(详请参阅 XPath 1.0 规范)。但是,除法字符引入了新的运算符 div,因为,斜杠(/)用于分隔定位步。
XPath字符串是有效的XML 1.0(Unicode)字符序列。
XPath中的字符串使用引号(' 或 ")包围起来。如果XML文档中的XPath字符串包含引号,可以选择:
l 分别使用'或"引起来。
l 如果表达式用双引号(")包围起来,则在表达式中使用单引号('),反之亦然。
XPath提供了非常有用的字符串处理函数,参见 函数库。
函数库
XPath 定义了一组函数,称为核心函数库。每个函数从三个方面来定义:
l 函数名
l 返回类型(必须的,不能使用 void)
l 参数类型(可以没有参数或者带有多个参数,参数可以是必需的也可以是可选的)
您可能会发现在谓词和表达式中经常会使用函数。其他规范如XSLT扩展了这个函数集。函数被分成四类,以下分别介绍:
l 节点集函数
l 字符串函数
l 布尔函数
l 数字函数
节点集函数提供关于一组节点(一个或多个节点)的信息。常用的节点集函数有:
l last()——返回一个称为上下文大小的数字,即给定上下文中的节点数,不同于最后一个节点。
l position()——返回一个称为上下文位置的数字,集当前节点在给上下文节点集(列表)中的位置。比如,可以用表达式 position()=last() 测试处理的是否是集合中的最后一个节点。
l count(node-set)——返回实参节点集中的节点数。
l id(object)——返回一个节点集,根据在 DTD 中声明为 ID 类型的唯一标识符选择元素。
XPath 还定义了和节点名及名称空间有关的其他三个函数:
l local-name()
l namespace-uri()
l name()
通过字符串函数您可以操纵字符串。常用的字符串函数有:
l