第4章《XPATH》

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

4XPathXPath是W3C制定的、用来在XML文档中进行导航和查询的路径表达语言,可以对XML文档层次结构中的相关元素节点及内容进行检索、定位。半结构化文档可以被看成为一棵树,文档的根节点对应于DOM树的根节点,叶节点对应于空的元素节点或者是文本节点,DOM树蕴含的信息通过树中节点数据及其节点之间的路径关系来进行描述。针对这种半结构化树所进行的XPath查询将返回满足指定特征(包括节点特征和路径特征)的节点或以这样的节点为根的子树。XPath规范W3C对XPath2.0(最新的XPath规范)的介绍如下:它是一种描述型语言,可以对符合XPath数据模型(将在本章中进行介绍)的数据进行处理,这种数据模型提供了XML文档的树型表示,其中包括原子值(比如整数、字符串、布尔类型的值)和序列(可能包含对XML文档中节点的引用以及原子值)。XPath的应用XPath技术是一种XML数据处理的基本机制,还广泛地应用于其他各个领域。第3章XMLSchema中介绍key和keyref元素时,就使用到了XPath。另外,在XQuery、XPointer、XLink等规范中也都需要使用XPath。Xpath工具使用:XQuery-w3cUserCases-XMP-bib.xml4.1XPath中的数据模型在Unix中,常说“任何东西都是一个文件(Everythingisafile)”在Java中,常说“任何东西都是一个对象(Everythingisanobject)”,而在XPath中,则可以说“任何值都是一个序列(Everyvalueisasequence)”。在XPath2.0中,每个表达式的结果值都是由0个或者多个项(item)组成的一个序列。4.1.1序列(Sequence)序列(Sequence)是W3C在XPath2.0中引入的一个新的概念。XPath1.0仅支持节点集(Nodesets),它表示由无重复的多个节点构成的无序的集合,而XPath2.0中的序列表示有序的、可包含重复值(节点和原子值)作为项的集合。(a,b,c)在XPath2.0中与(c,b,a)是不相同的两个序列,序列相等的条件是其中包含的项的个数相等,并且对应位置的项相等。序列的UML类图表示实际上序列是一个递归的概念:序列是由0个或者多个项(item)组成的集合,并且是有序的集合;项本身也可以是一个序列,或者是原子值或节点;序列:有序的集合序列是一个有序的集合,并且序列中的每个项都具有一个对应的位置参数(position)。序列S中的第一个项的位置为1,依次类推,可以使用count($S)来计算序列S中项的个数(即序列的长度),可以使用$S[i]来访问序列S中的第i项(就好像通过下标来访问数组中的元素一样),可以用position()函数来确定当前项目在序列中所处的位置。序列计算表达式①.序列构造表达式②.序列筛选表达式③.序列组合表达式序列是由()所包含的一个列表,其中每个项之间使用“,”进行分隔。I.(10,1,2,3,4)构造一个包含5个整数的序列II.()构造一个不包含任何项的空序列III.(1,2,4,2)构造一个包含取值相同的项的序列IV.(1,aabc/a)构造一个原子值和节点混合的序列V.(10,(1,2),(),(3,4))实际上等于(10,1,2,3,4)VI.(10,1to4)实际上等于(10,1,2,3,4)可以使用判定谓词对序列进行筛选。I.(1to100)[.mod5eq0]获得1到100中能被5整除的数II.$orders[fn:position()=(5to9)]取出$orders序列中第5到第9份订单使用序列操作符union、intersect、except对两个序列进行并、交、差操作,所有这些运算,将从结果序列中删除重复的值。假设$seq1为(A,B)、$seq2为(A,B)、$seq3为(B,C)。I.$seq1union$seq2结果为:(A,B)II.$seq1intersect$seq3结果为:(B)III.$seq1except$seq3结果为:(A)序列演示:(1to100)[.mod5eq0]XPath文档树模型在XPath中,将XML文档作为一颗逻辑上的文档树进行处理,以便通过路径对其中的节点进行寻址。这种文档树中一共包含其中类型的节点:文档节点(Documentnode)元素节点(ElementNodes)属性节点(AttributeNodes)文本节点(TextNodes)命名空间节点(NamespaceNodes)处理指令节点(PINodes)注释节点(CommentNodes)示例XML文档的文档树doc?PubCaret?paraSomeememphasis/emhere./paraparaSomemorestuff./para/doc节点的属性-节点的名称(NodeName)一般说来,文档树中的每个节点都应该有一个名称,这个名称可以是简单的本地名称、或者使用命名空间名称进行限定的完整名称。在XPath中,提供了一个node-name()函数,它可以返回指定节点的名称。对于元素节点,node-name()函数将返回元素的标记;对于属性节点,该函数将返回属性的名称;对于处理指令节点,该函数将返回处理指令的名称;对于命名空间节点,该函数将返回命名空间的前缀。对于文档节点、注释节点、文本节点,它们是没有名称的,所以node-name()函数将返回一个空序列。namespace-uri()可以返回节点的命名空间全称演示node-name()节点的属性——节点的字符串值(StringValue)每个节点都具有一个字符串值,实际上就是针对该节点使用XPath中的string()函数所得到的字符串结果。对于文本节点,其字符串值就是该文本节点的内容;对于属性节点,其字符串值就是该属性的取值对于元素节点,其字符串值是将以该节点为根的子树的所有文本叶节点从左到右串联起来的结果paraSomeememphasis/emhere./paraString(/para)=Someemphasishere.()函数演示节点的属性——节点的标识(Nodeidentity)对于XML文档树中的每个节点,系统将采用特定的方式对其进行标识,以便将一个节点与另一个节点区分开来,通常可以使用is操作符比较两个节点是否为同一个节点,而通过等值的比较是无法实现这一点的,因为它只能够判断两个节点的内容、结构是否相等。is操作符演示:(/doc/para[1])is(/doc/para[@length])4.2XPath的语法4.2.1XPath的简单示例librarybookchapter/chapterchaptersectionparagraph/paragraph//section/chapter/book/librarylibrary元素是book元素的父元素;而book元素是两个chapter元素的父元素。两个chapter元素是book元素的子元素,并且section元素是第二个chapter元素的子元素。book元素的两个chapter子元素之间是兄弟关系,因为它们具有相同的父元素。library、book和第二个chapter是section的祖先元素。两个chapter元素、section元素、以及两个paragraph元素,都是book元素的子孙元素。这里使用了术语:父(parent)、子(child)、兄弟(sibling)、祖先(ancestor)、子孙(descendant)。操作系统中的路径与XPath路径表达式的类比在操作系统中(比如Unix操作系统):在XPath中:/表示根目录;/表示文档节点;/library表示根元素(对于上面的示例);/users/dir/foo表示users目录下dir目录中的foo文件,该文件只能有一个,这是绝对路径表示形式。/library/book/chapter/section表示library元素下的book元素下的chapter元素下的所有section(可能有多个)。foo表示当前目录下的foo文件,该文件只能有一个,这是相对路径表示形式。section表示当前元素的所有section子元素(可能有多个)。.表示当前目录。.表示当前元素。..表示父目录。..表示当前元素的父元素。/users/dave/*表示/users/dave目录中的所有文件。/library/book/chapter/*表示/library/book/chapter下的所有元素。4.2.2XPath的完整语法形式1LocationPath::=RelativeLocationPath|AbsoluteLocationPath(1)RelativeLocationPath::=Step|RelativeLocationPath'/'Step|AbbrevRelativeLocationPath(2)AbsoluteLocationPath::='/'RelativeLocationPath?|AbbrevAbsoluteLocationPath(3)位置路径表达式可以分为相对位置路径表达式和绝对位置路径表达式,绝对位置路径表达式以/开头,后面跟的是相对位置路径表达式,或者直接是简写的绝对位置路径表达式;而相对位置路径表达式则由多个步进(Step)构成,比如Step1/Step2/Step3,那么步进Step又是什么呢?XPath的完整语法形式2每个Step由三个部分组成,轴标识符(AxisSpecifier)+节点测试(NodeTest)+零个或多个判定谓词(Predicate*)。其中,轴标识符表示对于当前节点(因为是相对位置路径表达式)往“哪个方向”进行查找,节点测试则通过给出节点的名称指出要查找“哪些节点(名称或者类型如何)”,而判定谓词表示对所查找到的节点按照指定的方式“进行筛选”。Step::=AxisSpecifierNodeTestPredicate*(4)AxisSpecifier::=AxisName'::'|AbbreviatedAxisSpecifier(5)AxisName::='ancestor'|'ancestor-or-self'|'attribute'|'child'|'descendant'|'descendant-or-self'|'following'|'following-sibling'|'namespace'|'parent'|'preceding'|'preceding-sibling'|'self'(6)NodeTest::=NameTest|KindTest(7)表示在XML文档树中,查找从文档节点到当前节点所经过的路径上的所有节点,不包括当前节点。表示ancestor关系轴查找的结果,再加上当前节点。表示查找当前节点的属性。表示查找当前节点的子节点。表示以当前节点为根的子树中的所有节点,不包括当前节点。表示descendant关系轴查找的结果,再加上当前节点。表示查找在当前节点之后的节点,换句话说,这些节点开始标记和结束标记都在当前节点的结束标记之后。表示查找在当前节点之后的兄弟节点。表示查找当前节点的命名空间。表示查找当前节点的父节点。表示查找在当前节点之前的节点,换句话说,这些节点开始标记和结束标记都在当前节点的开始标记之前。表示查找在当前节点之前的兄弟节点。表示查找当前节点本身。关系轴一共包括13种,每一种关系轴表示从当前节点出发向某个方向进行查找。示例XML文档及关系轴librarybookchapter/chaptersect

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功