`
xm_king
  • 浏览: 392986 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Spring技术内幕读书笔...
浏览量:15414
社区版块
存档分类
最新评论

查询XML之路--XPath(三)

    博客分类:
  • XML
阅读更多

XPath语法提要

学习XPath时应记住下述要领:分布定位,看清上下文。XPath定位分多个步骤进行,每个步骤都有单独的上下文环境。

一、      多个定位步骤组合成为一个XML路径

由于XML文档是层次型的结构,不像关系型数据库可以根据主键索引一步到位,所以,XPath分步定位元素,每步称为一个“定位步骤(Location step)”。定位步骤主要有两种:串联的定位步骤和并联的定位步骤。

(1)      串联的定位步骤

每个串联定位步骤之间用“/”分隔开来,从最左边开始,匹配节点,如前面的匹配失败,匹配不到节点,后面的匹配就不会继续进行。

定位步骤有“绝对定位步骤(absolute location step)”和“相对定位步骤(relative location step)”两种。前者是以“/”开头的定位步骤,表示从根节点,即文档节点开始定位;后者不是“/”开头的定位步骤,表示从上下文节点开始定位。

只有出现在XPath最前面的“/”才表示“绝对定位步骤”,在XPath其他地方出现的“/”则用于分隔定位步骤。绝对定位步骤匹配结果与当前节点无关;相对定位步骤匹配结果显然与XPath的上下文相关。同一个XPath表达式,相对于不同的节点,返回的结果不一样,这就是上下文节点对XPath匹配的影响。

(2)      并联的定位步骤

如果要同时匹配不同条件的节点,可以用“|”将多个表达式分隔起来。只有节点符合其中任何一个匹配路径,都会返回到结果中。

二、      XPath表达式的上下文

在上一节已经讲解了XPath上下文节点的概念,在此继续讲述XPath表达式的上下文(Context)XPath上下文有以下几个需要注意的概念。

(1)      发起XPath表达式求值的上下文节点(Context node)

(2)      XPath计算结果返回节点列表后,节点列表中节点的数目,称为上下文的大小(Context size)

(3)      当在遍历XPath求值返回的节点列表时,遍历游标所到达的节点,称为当前节点(Current node)

(4)      当前节点在上下文节点中的相对位置(Context position)

XPath上下文看似复杂,实际上并不难。在考虑XPath计算结果时,要将注意力放到XML文档中的特定节点,然后考虑该节点和周围节点的关系。

在多个定位步骤中,求值上下文节点随着定位步骤变化,上下文大小为上下文节点XPath匹配选出节点的数量。可分别用“last()”和“position()”函数计算XPath上下文大小以及当前节点在上下文中的位置。

三、      定位步骤由轴、节点测试和谓项3部分组成

上述的“定位步骤”实际上可有3个部分组成,模式如下:

轴:节点测试[谓项]

XPath模式中的3个部分并不是都要求出现的。“轴”的部分往往被省略(默认为子节点轴),而“谓项”也不要求一定出现。例如:XPath“目录/文件”,实际上就是这种省略了“轴”和“谓项”的定位步骤(默认的节点轴是子节点轴“child::”)

         轴(Axis)表示从当前节点开始,向哪个方向开始匹配节点,XPath中的轴有13条,可分为层次关系轴和线性关系轴两大类,在轴名称的后面要附有“::”,与后续的“节点测试”部分隔开。

         “节点测试”(Node-test)表示匹配轴方向的哪些节点。

         “谓项”(Predicate)借用了逻辑学上的一些概念,意思是说条件成立的前提条件。谓项在XPath中起到在“轴”和“节点测试”的基础上,进一步筛选匹配节点的作用,在谓项中可以使用XPath函数和表达式筛选节点(如上文提到的表达式“position()=1”中,position()就是一个XPath函数)。

在执行XPath查询的每个定位步骤时,执行如下步骤。

(1)      从当前节点开始,面向轴方向,如节点轴为“先代节点轴”,则沿XML元素外围移动,如节点轴为“后继兄弟节点轴”,则向后继兄弟节点方向移动。

(2)      在轴方向上执行节点测试,确定轴方向上符合测试条件的所有节点的列表

(3)      以节点测试后所得列表中的每个节点为基准,用谓项的XPath求值表达式逐一筛选节点。如表达式有多个谓项(如“轴::节点测试[谓项1][谓项2]”),则用各谓项依次筛选节点。

(4)      如谓项返回结果可转换为逻辑真,则将该节点添加到XPath的查询结果列表中。

总之,节点轴以XPath定位步骤的当前节点为基准,节点测试以节点轴为基准,谓项筛选则以节点测试所得的节点为基准,即轴、节点测试、谓项三者中,每一项的计算均以前者为基础。

注意:节点轴和节点测试组合的XPath定位表达式必须返回节点列表,而谓项的XPath求值表达式可以返回值。谓项表达式的计算结果被转换成布尔类型,用于筛选节点测试返回的节点。

XPath的基本概念已经介绍完了,至于轴、节点测试以及谓项的详细资料,可以查看W3C的文档,http://www.w3.org/TR/xpath

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics