XQuery使用入门(二)

  XQuery使用入门(二) 

作者:gobitan(雨水)  日期:2007-03-31  转载请注明出处 http://blog.csdn.net/gobitan 
在《XQuery使用入门(一)》中已经采用Berkeley DB XML搭建好了实验XQuery的环境,现在就可以正式开始学习XQuery了。本文主要介绍了使用XPath查询XML文档中的元素,使用谓词对查询结果进行过滤,以及对查询结果进行包裹和排序。
为了实验后面介绍的XQuery用法,首先得准备好一份XML文档(参见putDocument命令后,这里为了描述方便书籍内容与实际不符)。文档的内容是一份书籍的列表,XML文档的根是<booklist>。
首先创建一个名为xmlDb的容器,这里容器的概念就相当于关系数据库中的一个数据库,那么存入容器中的XML文档就相当于关系数据库中的一张表。
为了区分输入的命令和系统提示的结果,以底色为灰色的区域表示输入的命令,其它表示系统提示。
dbxml> createContainer xmlDb
Creating 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")/bookl
ist/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/book
where $book/@lang="en"
order by $book/Name
return $book/Name'
 
2 objects returned for eager expression 'for $book in doc("xmlDb/bookList.xml")/
booklist/book
where $book/@lang="en"
order by $book/Name
return $book/Name'
 
dbxml> print
<Name>Inside Widows Operation System</Name>
<Name>The Art of UNIX Programming</Name>
这里主要介绍了一些XQuery较为常用的使用方法,后面会逐步介绍一些较为深入的应用,欢迎关注。
 
关于作者:胡家辉,网名:雨水 目前主要专注于XML文档管理及相关技术。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
XML》实验任务书 XQuery [实验目的] 1、学习如何使用XMLSPY集成开发环境编写、执行、以及调试XQuery。 2、理解和掌握XQuery查询计划的基本结构、各种子句的使用、(递归)函数的声明和使用、嵌套查询的使用,能够熟练地利用集成开发环境编写完成各种查询工作的XQuery查询计划,为在主流关系数据库中使用XQuery进行数据检索打下基础。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,创建XQuery查询计划,熟悉工具菜单中为XQuery的执行、调试提供的各种支持。 2、逐个打开并执行XQuery->W3CUseCases中各类查询中给出的查询计划,并且弄懂其含义,并尝试自行编写; 3、打开附件中提供的Flights-Data.xml文档,编写下列XQuery查询计划,要求所得的结果必须是良构的XML文档: ①. 列出2005-12-24日从North Pole出发的所有航班(dataQ1.xquery); ②. 查询2005-12-24日最繁忙(计算出发和到达航班)的机场、以及其进出航班总数(dataQ2.xquery); ③. 按照2005-12-24日机场繁忙程度(计算进出旅客总数)列出机场(忽略没有旅客进出的机场)、以及其进出旅客总数(dataQ3.xquery); ④. 查询所有名为Santa Claus的乘客的航班目的地(dataQ4.xquery); 在上述查询计划中,③相对比较复杂,需要使用一些嵌套查询,如果有必要,可以逐步编写子查询,通过调试或者执行观察结果,然后组合构成完整的查询计划;也可以将某些嵌套查询封装为函数(需要使用序列类型来自定义函数),以增加查询计划的可读性。
Java中使用xQuery可以通过以下步骤实现: 1. 引入xQuery解析器:Java中可以使用Saxon或XMLStarlet来解析xQuery语句,需要在项目中引入相关的jar包。 2. 创建xQuery查询语句:使用xQuery语言编写需要执行的查询语句。 3. 创建XML文档:将需要查询的XML数据存储在一个XML文件中。 4. 解析XML文档使用Java中的DOM或SAX解析器解析XML文档。 5. 执行xQuery查询:将查询语句传递给xQuery解析器,并执行查询操作。 6. 处理查询结果:解析器返回查询结果,Java程序可以将结果存储在内存中或输出到文件等。 以下是一个使用Saxon解析器执行xQuery查询的Java示例代码: ```java import net.sf.saxon.s9api.*; public class XQueryExample { public static void main(String[] args) throws SaxonApiException { // 创建xQuery查询语句 String xquery = "for $x in doc('example.xml')//book where $x/price>30 return $x/title"; // 创建Processor和XQueryCompiler对象 Processor processor = new Processor(false); XQueryCompiler compiler = processor.newXQueryCompiler(); // 编译查询语句 XQueryExecutable exec = compiler.compile(xquery); // 创建XQueryEvaluator对象 XQueryEvaluator query = exec.load(); // 解析XML文档 DocumentBuilder builder = processor.newDocumentBuilder(); XdmNode doc = builder.build(new File("example.xml")); // 设置查询上下文 query.setContextItem(doc); // 执行查询并处理结果 XdmValue result = query.evaluate(); for (XdmItem item : result) { System.out.println(item.getStringValue()); } } } ``` 以上代码中,使用Saxon解析器执行了一个xQuery查询,查询了一个XML文档中价格大于30的书籍的标题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gobitan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值