APP下载

基于XQuery实现XML高效查询的分析研究

2009-09-30蔡可训

电脑知识与技术 2009年34期

蔡可训

摘要:当愈来愈多的数据资料以XML为标准格式进行存储时,由于其格式的不同而导致传统的数据库及查询语法无法适用,该文分析了一种全新的XML查询语言XQuery,并对其在相关领域的应用作了介绍和比较。最后,对XQuery的发展前景作出展望。

关键词:XQuery;XML;XML查询语言

中图分类号:TP393文献标识码:A文章编号:1009-3044(2009)34-9640-04

Analysis and Research of XQuery on XML query

CAI Ke-xun

(ZhenJiang Price Bureau, ZhenJiang 212001, China)

Abstract: A new XML query language, XQuery is analyzed in this paper, and its applications in relational fields are also introduced and compared. Development of XQuery is prospected in the end.

Key words: XQuery; XML; XML query language

随着电子商务的蓬勃兴起和WEB应用的日益广泛,为克服HTML固有的表达局限性,同样源自于SGML(Standard Generalized Markup Language)标准通用标记语言的一个精简子集XML应运而生。自万维网联合组织W3C(World Wide Web Consortium)于1998年完成XML标准制订以来,XML迅速成为第二代WEB应用的基础,获得了业界所有大型公司(如IBM及微软等)的全面支持。XML允许信息提供者根据需要自行定义标记及属性名,其良好的数据存储格式及可扩展性使之迅速得到了广泛的应用。

当愈来愈多的数据资料以XML为标准格式进行存储时,由于其格式的不同而导致传统的数据库及查询语法无法适用,如何以高效快捷的方式实现文件资料的转换与提取,成为XML发展的又一个重要方面。从2000年1月起W3C开始着手拟订一种XML数据库查询语言XQuery,该语言可实现条件查询、排序、连结、筛选、分类汇总等数据操作,具有条件表达式、分支语句、循环语句及排序子句等,还提供了一系列可用于求和、求平均数等运算的内置函数,这种语言利用了XPath的路径表达式实现对XML中的节点定位,无疑,这一标准一旦形成W3C正式建议,则将会对XML的进一步发展带来深远的影响。本文将就此查询语言作一分析探讨。

1 XML及其相关标准的概述

XML包含有三个要素:文档类型定义DTD(Document Type Definition)或XML大纲(XML Schema)、可扩展样式语言XSL(eXtensible Stylesheet Language)和可扩展链接语言XLL(eXtensible Link Language)。其中DTD及XML Schema定义了XML文件中的元素、元素的属性及元素与元素属性之间的关系并规定了XML文件的逻辑结构;XSL使数据与其表现形式相互独立;XLL描述了资源之间如何链接,可以从不同的方向进行遍历,并可将链接存储在独立于引用文档的数据库中。

W3C为XML制定了三个技术规范[1]:XSLT(XSL Transformations)、DOM(Document Object Model)和XPath(XML Path Language),其中XSLT的作用是将某种结构的XML文件转换为另一种结构的XML文档(含HTML文档);DOM则提供了一种功能强大的编程接口,使应用程序能够访问和更新XML文档的样式、结构及内容,这由支持DOM的解释器来实现,将可得到一个包含XML文档中所有元素的树状结构;XPath定义了一些可对XML文档中的数据进行“寻址”的表达式,其操作对象是XML树状结构中的节点,其中最重要的表达式称为“定位路径”(Location Path),在微软的msxml及IBM的xalan这两个支持XPath的软件系统中其运算对象是DOM的 文档(Document)或节点(Node)。

这三者的典型应用关系可简述如下:利用XPath检索存放数据的XML DOM,得到需要查询的数据子集,进而利用DOM提供的接口控制XSLT中的模板,将检索出来的数据按照适当的方式显示在用户浏览器窗口内,另外,可以利用XPath寻址XML和XSLT DOM中的节点,然后通过DOM提供的编程接口对XML中的数据和XSLT模板中的参数进行动态修改[2]。

2 XQuery查询语言发展状况

XML的发展趋势将成为互联网上的通用数据库,实现平台无关化,且不依赖于机器类型,其数据结构的开放性使得数据的查询检索成为一个极其重要的领域。上述以XPath及DOM等为基础的应用还仅是一种初步的方法,尤其是DOM节点与XPath节点之间的一些不一致问题还有待解决。随着用XML存储、交换和表述信息的应用日益增多,人们对其研究也越来越深入,如何从XML数据源中准确有效地获取所需信息,也就变得越来越重要。目前已有的查询语言如XQL、XML QL、QUILT、XML GL、XPath、QOL、YATL、Lorel等一般具有较强的针对性,往往只适用于某种或少数几种数据类型的查询,为了适应XML的发展需求,XML通用查询语言的制定工作显得关键而重要。

W3C于2000年1月公布了第一版XML查询语言需求草案文件(XML Query Requirements W3C Working Draft),对XML的查询语言本身及XML查询数据模板、表示法的发展方向及使用环境等进行了规范,其制定原则是构建于W3C发展中的另一个标准规范XML Infoset之上并支持命名空间(Namespaces)的应用。它规定了查询的应用范围不应只限于单一的XML文档内,且应可基于文件的内容及结构对查询条件作出定义,从而实现在整个文件或部分内容中进行检索的目的,最终要求查询的结果可根据用户需求自动构造成新的XML文档[3]。目前该语言的最新版本是2002年11月15日发布的Xquery草案。

国际标准组织W3C的XML Query工作小组及XSL工作小组最近于2003年2月14日为XML的全文检索工作发布了两份草案文件,分别为XQuery and XPath Full-Text Requirements和XQuery and XPath Full-Text Use Cases。前者明确提出全文检索需能够处理XQuery/XPath文档模型中的示例且无须设计成类客户端的界面语言,若Xquery/Xpath Full-Text支持查询元素与属性名时,应能对元素内容、属性值等进行区分[4];后者则阐述了全文检索的实际应用,以范例形式说明了全文检索的各个功能。这一切牵涉到以全文标记化(tokenized)方法对XQuery和Xpath语言的扩充,基本机理是将一段文字逐字、逐标点地分成若干个标记(token),从而使相关位置上的单字能够参与检索运算,这样不仅能实现邻近单字的查找,而且还能对其它字元及字根的使用进行处理[5]。

3 XQuery分析及应用比较

3.1 XQuery描述

XQuery由Quilt所衍生而来,同时又从XPath和XQL中吸收了路径表示语法以适应层次结构文档的需要,融入了SQL中基于关键字系列子句的思想,为数据重建提供了类SQL的Select From Where模式,并吸取了OQL中由几种不同表达式全嵌套组成的功能语言概念。XQuery作为一种将查询表示成表达式的功能语言,可以完全嵌套,故而沿用了子查询的功能与用法。

XQuery语言的组成单位可称为查询模块(query modules),模块之间相互独立但多个模块可以用分号隔开同时使用并被合法解析,以下是XQuery中的表达式组成体系:

1) 主要表达式(Primary Expressions):这是XQuery的基本单元,包括有字符、变量、函数调用及决定优先级的括弧使用,其中一个URL字符在定义上等价于一个字符串。

2) 路径表达式(Path Expressions):其语法基于Xpath 1.0,这是一种以路径方式浏览XML文件的标记法,在路径表达式的开始处可指定文件中的一个特定节点或一个包含有其他子节点的父节点,再按照文件结构配合以XPath的语法以寻找出符合检索路径的数据。例如:document(“myxml.xml”)//chapter[2]//figure[caption=“SearchThisData”]。

首先是找到myxml.xml文件中的根结点,然后查找根节点内的第二个chapter子结点,最后检索出此chapter子结点中包含有caption元素且其值为SearchThisData的figure子结点。

3) 序列表达式(Sequence Expressions):XQuery支持结构化运算及组合序列,序列指零或其他项目的有序集合,其中一个项目允许是一个单位值或一个节点。例如以下表达式构造了一个序列10、(1,2)、空序列()及(3,4):

(10, (1, 2), (), (3, 4))

序列表达式中的项目可以进行插入及移除操作。

4) 算术表达式(Arithmetic Expressions):包括常见的加、减、乘、除及取模运算等。

5) 比较表达式(Comparison Expressions):Xquery提供了4种比较表达式如数值比较、节点比较等,下例为一个返回结果为“假”的表达式,原因是每个结构化结点均具有自己的标识:

5 is 5

6) 逻辑表达式(Logical Expressions):该表达式的组成形态为“AND”及“OR”中的两者之一,其运算结果总为TRUE或FALSE(除非出现错误例程)。

7) 构造式(Constructors):Xquery提供该方法的用途在于利用查询结果生成一个XML结构的文件,以便于存储和调用。其中它提供了在数据模型[XQuery 1.0 and XPath 2.0 Data Model]中列出除命名空间(namespace)节点以外的每一种结构,另外,它还具有一种称为计算结构(computed constructor)的特殊形式,可以创建出一个文档节点或其中的某个元素及其属性。作为构造式中的重要类别——元素构造表达式(Element constructors),通常可实现查询时除对现有数据进行检索外,并可利用查询结果产生新的数据的功能,这种方法允许使用XML的标记法直接将元素包含于查询之中,也即允许以XML元素本身作为查询的表达式。在早期的Xquery草案版本中,它曾作为与上述逻辑表达式等相并列的一类表达式出现,新的版本将其归纳于Constructors构造式之中。

8) FLWOR表达式(FLWOR expressions):它由FOR、LET、WHERE、ORDER BY及RETURN等子句以特定顺序组合而成。早期版本中含有排序表达式(Sorting)这一类别,是指查询时有时需要控制输出数据的排列顺序,该子句可设定多个排序条件,并可附加升幂(Ascending)或降幂(Descending)两个关键字设定排序的方向。当时FLWOR表达式只是称为FLWR表达式,即不含有ORDER BY子句。该表达式第一部分中包含了FOR或LET子句,其值由一到多个变量组成,且变量的组成是其他表达式如路径表达式等。一个FLWOR表达式可能包括多个FOR或LET子句,并将由WHERE子句进行条件筛选并可通过ORDER BY子句进行排序,最终满足检索条件的结点数据才会包含于RETURN子句中。如下例所示,表示可列出设备(Equ)中制造商(Fac)为“沈阳某机械厂”并且于2001年购买的设备名称(Name):

FOR $e IN document("myxml.xml")//Equ WHERE $e/Fac="沈阳某机械厂"

AND $e/year="2001"

RETURN $e/Name

9) 无序表达式(Unordered Expressions):这一表达式在传统的数据查询语言中较少出现,而在定义XML查询规范时却有着极其重要的意义,这一表达式未列入早期版本,草案制定的过程中讨论增加了这一功能。WEB化下的检索对实现效率要求极高,故对于一些对排序根本无要求的返回结果若按照常规排序后输出将会增加服务器运算及响应方面的负担,以下是一个无序函数使用的示例(查询返回教师及所对应授课的课程代码):

unordered(

for $t in document("teachers.xml")//teacher[name = "Wangh"],

$l in document("lessons.xml")//lesson

where $t/lessonid = $l/lessonid

return

{$t/teacherid, $l/lessonid }

)

10) 条件表达式(Conditional Expressions):其基本语法为“if” “(“ Expression1 “)” “then” Expression2 “else” Expression3,含义为首先判断Expression1 条件式是否满足,为true则返回Expression2,否则返回Expression3。

11) 限定表达式(Quantified expressions):在某些查询需求下,需测试是否全部或只有部份元素符合某个条件,Xquery为此专门提供了“some”及“every”表达式用來分別表示“部份”及“全部”的选择。下例使用“some”表示取得book中段落只要有包含sailing及windsurfing的Name元素:

FOR $b IN //book

WHERE SOME $p IN $b//para SATISFIES

(contains($p, "sailing") AND contains($p, "windsurfing"))

RETURN $b/Name

同样,下例使用“every”表示取得book中每个段落均含有sailing的Name元素:

FOR $b IN //book

WHERE EVERY $p IN $b//para SATISFIES

contains($p, "sailing")

RETURN $b/Name

12) 用于序列类型的表达式(Expressions on SequenceTypes):它通常作为一种附加的函数参数出现,用于instance of、typeswitch、cast、castable和treat表达式中。

13) 确认型表达式(Validate Expressions):该表达式在早期版本中不列为主要类型,以下为用法示例:

ValidateExpr :: = (<"validate" "{"> | (<"validate" "context"> SchemaGlobalContext ("/" SchemaContextStep)* "{"}) Expr "}"

W3C关于该表达式的说明中指出目前“{”及“}”括号的应用在嵌入式表达式的环境中还存在着一些问题。

3.2 应用示例

制定XQuery标准前W3C提出了针对XML查询的相关需求,其中一项提及XML查询语言应可实现在多个文档中实现关联性连结查询。以下以教师授课为例说明其实现过程,要求根据目录关联表产生课时安排文档,将教师与其授课信息以姓名、课程名为序排列输出。

首先建立三份XML文档:teachers.xml(教师信息表)、lessons.xml(课程信息表)、catalog.xml(课时安排目录表)。

teachers.xml中包含若干个节点,每个节点依次包含等子节点。

lessons.xml中包含若干个节点,每个节点依次包含、<issue>等子节点。</p><p>catalog.xml中含有上述文档的关联属性,由若干个<item>节点组成,其中每个<item>中依次包含<teacherid>、<lessonid>、<time>等子节点。</p><p><teacher-lesson></p><p>{</p><p>FOR $i IN document ("catalog.xml")//item,</p><p>$t IN document ("teachers.xml")//teacher[teacherid=$i/teacherid],</p><p>$l IN document ("lessons.xml")//lesson[lessonid=$i/lessonid]</p><p>RETURN</p><p><item></p><p>{</p><p>$t/name,</p><p>$l/title,</p><p>$i/time</p><p>}</p><p></item></p><p>SORTBY (name, title)</p><p>}</p><p></teacher-lesson></p><p>以上示例显示了一个内部关联的数据表连结过程,实际上XQuery 中与传统SQL语言相类似,同样也提供了外部关联的操作,如左关联、右关联等。</p><p>3.3 XSLT与XQuery的比较</p><p>XSLT于1999年成为一个W3C建议标准,具有根据相关模板中指定的数据转换方式对XML结构的文档进行输出样式处理的功能,但是,由于XSLT在表达式和模式方面运用了Xpath,而XPath是XQuery的一个子集,因此它一直与XQuery标准化进程一起被不断地修订完善。</p><p>XSLT与XQuery之间最显著的差别在于一个XSLT样式表(stylesheet )实际上是一个XML文档,通常与Xquery相比其缺陷是不易阅读且文档不够简洁。</p><p>XSLT和XQuery之间更重要的差异是执行模型,特别是指控制流方面。如果不去考虑Xquery中与众不同的数据类型,则它可认为是一种相对普通且含有显式控制流的程序语言。相反,一个XSLT样式表的执行受一个模板处理器控制,每个节点均与一套模板相匹配对应,并在当前节点的子节点上进行模板的递归调用。使用模式匹配方式执行应用通常是较为高效便捷的,但当运用其进行更为复杂的编程时,则会变得很不灵活而且代码冗长。</p><p>4 目前应用状况</p><p>尽管Xquery目前尚处于草案阶段,但因其有着良好的应用前景,故而传统大型数据库开发公司均在加紧制定各自的标准及规范以期实现对Xquery的支持。2002年3月Oracle发表了Java XQuery的原型标准,其中包含一个XQuery的Java API(称为JXQI)及一个使用命令行操作的界面。它参照了W3C的Xquery标准并加上Oracle的自定义功能,并致力于文档关联及XQuery用例(XQuery use cases)方面的支持。另外它还包含一个实验性质的JDBC式的Java API供XQuery使用,并可在SQL的查询结果上使用XQuery。Oracle最终希望能提供XQuery-based兼具SQL风格的查询语言,以供用户在Oracle数据库中对XML文档内容进行准确查询。</p><p>目前已商业化的软件产品有X-Hive公司发布的X-Hive/DB 3.0版本,其内置了XQuery引擎,并提供了转换或格式化XML文档的功能,可实现XHTML或PDF格式的转换。为符合用户需求,X-Hive/DB支持的XML公开标准包含XML 1.0、XQuery、XPath、XSL、XPointer、XLink、Xupdate及DOM.等。此外Ipedo Inc.公司研制的可以运行于Sun Solaris 7 & 8、Red Hat Linux (version 6 & 7)、Windows 2000或Windows NT平台上的Ipedo XML Database (目前版 本2.0)是一套专门用以存储XML文档的数据库系统,其存储方式有別于传统关联式数据库,适合作为XML的內容管理平台。它以XML Schema、DTD来组织与分类文件以实现集中式的XML管理,使用W3C XQuery查询语言,并可由XML Schema或DTD建立用户自订的索引,同时还具有易于整合的特性。</p><p>5 结束语</p><p>随着XML技术的发展,各种数据格式之间的差异已逐渐地减少直至可能在未来实现统一化的数据平台。Xquery的标准制定就是为了解决各类广泛数据源的数据查询检索问题,这种全新的查询语言将会促进重要的数据技术变革,并将成为统一的数据交换媒介。</p><p>参考文献:</p><p>[1] 陈奇. XSLT、Xpath和DOM的应用研究[J]. 计算机工程,2003,29(3):14-15.</p><p>[2] World Wide Web Consortium. XML Path Language (XPath) Version 1.0. http://www.w3.org/TR/1999/REC-xpath-19991116. W3C Recommendation 1999-11-16. </p><p>[3] World Wide Web Consortium. XQuery 1.0: An XML Query Language. http://www.w3.org/TR/2002/WD-xquery-20021115/. W3C Working Draft 2002-11-15.</p><p>[4] World Wide Web Consortium. XQuery and XPath Full-Text Requirements. http:// www. w3.org/TR /xmlquery-full-text-requirements/. W3C Working Draft 2003-02-14.</p><p>[5] World Wide Web Consortium. XQuery and XPath Full-Text Use Cases http:// www. w3.org /TR /xmlquery-full-text-use-cases. W3C Working Draft 2003-02-14.</p><p></time></lessonid></teacherid></item></item></p><p></issue>