XQuery使用入门
作者:gobitan(雨水) 日期:2007-03-29 转载请注明出处 http://blog.csdn.net/gobitan XQuery是一种查询语言,它对于XML就像SQL对于关系数据库表一样。要学习SQL 最好的办法就是弄个数据库来编写SQL语句练手,XQuery的学习也不例外,下面我们就来搭建一个可以练手XQuery的环境。目前主流的原生XML数据库在我的另一篇文章《四个主流的Native-XML数据库》中已经做了介绍。其中Tamino XML Server是一个非常不错的Native-XML数据库商业产品,提供了丰富的工具和各种接口,但是它的安装和使用也比较复杂。Tamino XML Server的管理基本上都是通过Web方式,因此还需要安装Apache服务器。这里搭建的环境采用了较为轻巧的Berkeley DB XML嵌入式数据库。它的安装和使用较为简单,但只提供了命令行方式操作的接口,不如Tamino提供的GUI界面那么直观。Berkeley DB XML(以下简称BDB XML)是一个开源的嵌入式数据库,最先由SleepyCat公司主要负责开发,后来Oracle公司把它收购了。关于BDB XML的特点请参见文章《四个主流的Native-XML数据库》。这里主要介绍采用BDB XML如何搭建一个可以练手XQuery的环境。第一步:下载可以到Oracle公司的网站上去下载,当前最新版本为2.3.10。下载地址为:http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html(不保证一直有效),选择Berkeley DB XML 2.3.10 .msi Windows installer,文件大小为52.7M。 第二步:安装双击下载后的安装文件,一路默认安装直至安装完成。如果安装成功,系统会注册环境变量,此时在命令行中输入dbxml就可以进入BDB XML的Shell操作了。 第三步:执行你的第一个XQuery查询语句要想试手XQuery,首先得熟悉Berkeley DB XML的基本使用,向数据库中存储一些数据以供查询。Berkeley DB XML使用很简单,下面就简要介绍一下。BDB XML提供Shell命令行交互。有两种方式可以进入BDB XML Shell,即通过cmd进入然后键入dbxml命令和直接通过开始菜单找到Berkeley DB XML Shell进入。BDB XML数据库以容器的方式存储XML数据,因此要先建一个容器。(1)创建容器createContainer phone.dbxml如果命令执行成功,系统会返回” Creating node storage container with nodes indexed”此时创建了一个名叫phone的容器。createContainer是创建容器的命令,后面是容器的名称。 (2)向容器中存入XML文档putDocument phone1 '<phonebook><name><first>Tom</first><last>Jones</last></name><phone type="home">420-203-2032</phone></phonebook>' s上面的命令存入了一个名叫phone1的XML文档。如果命令执行成功,系统会返回” Document added, name = phone1” putDocument是存入文档的命令,后面紧跟文档名称,最后是用单引号括起来的XML文档内容,并以s结束。 (3)执行XQuery查询query 'doc("phone.dbxml/phone1")'如果成功,系统会返回” 1 objects returned for eager expression 'doc("phone.dbxml/phone1")'”然后键入print查看查询结果如下:<phonebook><name><first>Tom</first><last>Jones</last></name><phone type="home">420-203-2032</phone></phonebook> Query是查询命令,doc是XQuery的一个函数,用于表示XML文档。到此为止,成功了执行了第一个XQuery语句。它还很简单,后面我们会介绍更为深入的应用。
在《XQuery使用入门(一)》中已经采用Berkeley DB XML搭建好了实验XQuery的环境,现在就可以正式开始学习XQuery了。本文主要介绍了使用XPath查询XML文档中的元素,使用谓词对查询结果进行过滤,以及对查询结果进行包裹和排序。为了实验后面介绍的XQuery用法,首先得准备好一份XML文档(参见putDocument命令后,这里为了描述方便书籍内容与实际不符)。文档的内容是一份书籍的列表,XML文档的根是<booklist>。首先创建一个名为xmlDb的容器,这里容器的概念就相当于关系数据库中的一个数据库,那么存入容器中的XML文档就相当于关系数据库中的一张表。为了区分输入的命令和系统提示的结果,以底色为灰色的区域表示输入的命令,其它表示系统提示。dbxml> createContainer xmlDbCreating node storage container with nodes indexed上面底色为灰色的命令创建了一个名字为xmlDb的容器,下面的是系统操作成功后的提示。 dbxml> putDocument bookList.xml '<booklist> <book lang="en"> <ISBN>7121021161</ISBN> <Name>The Art of UNIX Programming</Name> <Author>Eric Steven Raymond</Author> <Press>Addison-Wesley Professional</Press> <Price>59.00</Price> </book> <book lang="en"> <ISBN>9787121039690</ISBN> <Name>Inside Widows Operation System</Name> <Author>Russinovich,M.E.</Author> <Author>Solomon,D.A.</Author> <Press>Microsoft Press</Press> <Price>99.00</Price> </book> <book lang="zh"> <ISBN>0131411551</ISBN> <Name>Unix Network Programming</Name> <Author>By W. Richard Stevens</Author> <Author>Bill Fenner</Author> <Author>Andrew M.Rudoff</Author> <Press>Addison-Wesley Professional</Press> <Price>79.00</Price> </book></booklist>'Document added, name = bookList.xml上面的命令是将准备好的一份XML文档通过putDocument命令存入xmlDb容器中。文档的名称为bookList.xml。这里需要提醒的是,前面一步的createContainer命令会将创建成功的容器默认为当前的容器,因此存入文档时就不需要指定存入的容器了。 (一)使用XPath查询XML文档中的元素XPath是一用于定位XML文档中元素位置的路径语言,通过它可以准确地定位到XML文档中的任何一个元素或属性。XPath使用起来很简单,一看就明白。它以反斜杠’/’来分隔XML的层次关系结构。比如下面的例子就是要查询书籍的名字,根据它在XML文档中的位置就可以一次从根元素booklist然后到book元素,最后到Name,如下所示:dbxml> query 'doc("xmlDb/bookList.xml")/booklist/book/Name'3 objects returned for eager expression 'doc("xmlDb/bookList.xml")/booklist/book/Name' dbxml> print<Name>The Art of UNIX Programming</Name><Name>Inside Widows Operation System</Name><Name>Unix Network Programming</Name> (二)使用XQuery谓词对查询结果进行过滤上面查询出了XML文档中所有书籍的名称,如果只想查某类书籍,比如语言是中文的。那么我们可以采用谓词对查询结果进行过滤。谓词的使用方法是直接在想要进行过滤的元素后加上一个以方括号包含表达式即可。表达式以@符号开头,并附以布尔表达式。比如只查中文的书籍布尔表达式为lang=”zh”,完整的查询语句如下:dbxml> query 'doc("xmlDb/bookList.xml")/booklist/book[@lang="zh"]/Name'1 objects returned for eager expression 'doc("xmlDb/bookList.xml")/booklist/book[@lang="zh"]/Name' dbxml> print<Name>Unix Network Programming</Name>从上面结果可以看出,该查询语句过滤掉了lang属性不是zh的书籍的名字。 (三)使用XQuery命令对查询结果进行包裹在实际的应用中,往往需要将查询的结果进行包裹,形成新格式的XML数据。比如加上<html>标记包裹成一个HTML网页,或者加上根元素形成另外一份XML文档。这里以将书籍名称的查询结果包裹为一个订单,即加上<order>根元素。包裹的方法是先写好包裹后的格式,然后通过{}将查询结果放入其中即可。如下所示:dbxml> query '<order>{doc("xmlDb/bookList.xml")/booklist/book[@lang="zh"]/Name}</order>'1 objects returned for eager expression '<order>{doc("xmlDb/bookList.xml")/booklist/book[@lang="zh"]/Name}</order>' dbxml> print<order><Name>Unix Network Programming</Name></order> 通过包裹后的查询结果就形成了一份新的XML文档。 (四)使用XQuery命令对查询结果进行排序在使用SQL语句的时候,对查询结果进行排序可以说是再常见不过了。这里理所当然应该介绍如何在XQuery中实现这一功能。对XQuery查询结果进行排序比前面的几项要复杂一些。从下面的例子可以看出,它还涉及到了for、where、order by、return几个关键词。这里对for、where和return几个关键词不做多介绍。用过SQL的对order by应该非常熟悉了,但要注意在XQuery中对排序的元素(相当于关系表中的字段)的引用于SQL有些不同。它需要在元素前加上$前缀,后面遵循XPath语言规范。如下所示:dbxml> query 'for $book in doc("xmlDb/bookList.xml")/booklist/bookwhere $book/@lang="en"order by $book/Namereturn $book/Name' 2 objects returned for eager expression 'for $book in doc("xmlDb/bookList.xml")/booklist/bookwhere $book/@lang="en"order by $book/Namereturn $book/Name' dbxml> print<Name>Inside Widows Operation System</Name><Name>The Art of UNIX Programming</Name>