XQuery查询语言及例分
本文介XQuery查询语言的主要特性,并通过实讨论XQuery言在数据查询转换等方面的用。
引言
XML上的数据表示和数据交准。始,它的自描述和特定可展性等核心特性提供了不同用程序之消息传输所需的灵活性。特是随着近年来Web Service的蓬勃展,XML越来越多地活在数据交和存储领域,用XML表示的半构化数据越来越普遍,在B2B子商中尤其明。面XML数据量的指数的增,必然要求更有效的数据管理能力和更快、更精确的查询。因此,如何从XML数据源中准确有效地查询所需信息,也就得越来越重要
一、XQuery概述
XQuery工作19999月正式成立,其任建一灵活的查询语言以便从XML文档中抽取数据。目前W3C所公布的最新XQuery草案是20031112日的版本,它在不断的修
和完善之中[1]。作新型的查询语言,XQuery汲取了其它多种查询语言的点,适用于各种类型的XML数据源的查询,不仅查询功能大,而且简洁灵活且易于实现。而且,XQuery具有从多数据索信息的特点,它能数据和文档查询
XQuery构建在XPath范之上,其核心是能XPath表达式从文档选择特殊的点序列。XQuery是一查询表示成表达式的功能言。通它所支持的多表达式,它的查询可以有各不同的形式。各XQuery表达式可以完全嵌套,也支持子查询。目前,数据库业界的三大主流厂商OracleIBMMicrosoft都已在各自的品中提供了XQuery范的支持
二、XQuery及其
1 查询应
XQuery具有大的查询索功能,它通关键字、符号、操作数构成的表达式完成查询,其表达式的操作象可以又是另一个表达式。作函数言,它表达式行相互嵌套。同它也是一种对数据型有要求格的言,表达式中的操作数,运算符和函数都必是指定的[2]
首先来看一个表述籍信息的XML文档l的例子。
<bib>
<vendor id="id1_2">
      <name>china-pub</name>
<book>
  <title>JAVA编程思想</title>
  <publisher>机械工业出版社</publisher>
<year>2002</year>
<author>
    <firstname>Bruce</firstname>
    <lastname>Eckel</lastname>
  </author>
  <price>99</price>
</book>
<book>
  <title>XML手册</title>
  <publisher>电子工业出版社</publisher>
  <year>2003</year>
<author>
    <firstname>Charles F.</firstname>
    <lastname>Goldfarb</lastname>
  </author>
  <price>69</price>
  </book>
</vendor>
……
</bib>
1 1 XPath
XPath是一能在XML文档中定位信息的言,它能从XML文件中抽取目或一组项目。 XPath似于平算机系中使用的文件路径,就像我熟知的C:\ WINNT 。通XPath路径表达式,可以在XML文档中松地定位数据,确定点。比如下面个基本型的XPath表达式(对应上面的XML文档):/bib/vendor/@id个表达式从文档根始,选择所有 bib子元素,然后选择bib的所有vendor子元素,最后选择vendor子元素的所有id属性。当然,XPath表达式所提供的能力远远简单语句所做的工作。
使用XPath可在XML构中快速定位和提取信息,它的内建函数提供了全面的功能,可以方便的理数及文本数据。
下面列一些典型的XPath路径表达式:(用“/”路径始代表元素的绝对路径
路径表达式
选择XML文档部分
/
选择XML文档的根
/*
选择点的所有子点,*匹配任意子
/bib
选择点的所有bib元素
//book
选择点的所有后代点中的book元素
//@id
选择含有id属性的子
/bib/book[2]
选择bib的第2个子元素
//vendor[@id='id1_2']/book
选择符合属性id=’id1_2’”的所有book元素
/bib/vendor/book[year>2002]
选择符合元素year>’2002’”的所有book元素
当然,XPath实现很多其他的功能,具体参看W3CXPath[3]
1 2 FLWR表达式
XQuery 中最大的特性是 FLWR 表达式( flower),它是一典型的能完成具有某种实际查询的表达式。FLWR表达式包含模式匹配、过滤选择果构造操作。FLWR 句是 XQuery 所具有的最接近于 SQL 句。使用 FLWR 句,可以用比 XPath 1.0 句更自然的方法来建特定的查询[5]
FLWR表达式是由FOR—LET—WHERE—RETURN四个关键字定的子句构成的,在最新的准中更新FLWORO代表新加入的Order by子句。
xml技术的主要应用FLWOR表达式分代表FOR—LET—WHERE—ORDER BY— RETURN 的首字母。由此成的FLWOR 表达式可以完成很多在 XSLT以完成的任。它支持迭代并且可以把定到中间结果。两个或多个文档接和重构数据时这种表达式非常有用。 FLWOR 表达式都有一个或多个 for 子句、一个或多个 let 子句、一个可 where 子句、一个order by子句以及一个 return 子句。FOR 子句通定到量,
以便继续去循序列中的一个点;let 子句一个一个或一个序列;return 子句定义每个元要返回的内容;where子句,如果其有效布尔值为真,那么该就被保留,并且它的定用在return子句中,如果其有效布尔值为假,那么该就被弃。
下面是一个简单例子
下面是一个简单例子:
for $i in document("l")/bib/vendor/book
where $i/price>80
return
<HighPricedBook>
{$i/title, $i/price}
</HighPricedBook> 
此例没有用到let句,它只是可的。要注意的是,量都是以符号$开头的,量被
定到不同的点序列,然后通过语传递。花括号{}代表出信息,以及要行求的信息。可以看出,FLWOR表达式是一个有多种变化的表达式型,它可以生成大量不同的查询实例。“return”关键字后面的操作本身可以被另一个 FLWOR 表达式替代,可以不断将 FLWOR 表达式首尾相接,使XQuery具有非常丰富的表达能力。
查询结
<HighPricedBook>    <title>JAVA</title>    <price>99</price> </HighPricedBook>

13 其他功能
除路径表达式和FLWR表达式之外,XQuery5基本的表达式模式:元素构造符、算子和函数表达式、条件表达式、限定表达式、列表构造符、数据型表达式[4]。通的多种组合,可以生具有丰富而大的查询检索功能的查询语句。
下面是一个使用了算运算符‘+’例:
let $a:=document("l")/bib/vendor/book[1]/price
let $b:=document("l")/bib/vendor/book[2]/price
return <total_price_of_books>
{$a+$b}
</total_price_of_books>
查询结果如下:
<total_price_of_books>168</total_price_of_books>
查询语句中,可以使用if …then…else…这样选择结构,比如下例:
for $i in document("l")/bib/vendor/book
return
if ($i/price < 70)
then <LowPricedBook>{$i/title, $i/price}</LowPricedBook>
else <HighPricedBook>{$i/title, $i/price}</HighPricedBook>
查询结果如下:
<HighPricedBook>    <title>JAVA</title>
<price>99</price> </HighPricedBook>
<LowPricedBook>    <title>XML handbook</title>
<price>69</price> </LowPricedBook>
2转换应
用集成,某个域的用可以使用多种词汇表,如果用之行交互,包括数据的交,那么针对不同词汇XML文档转换就很有必要了。这时XQuery就能很好的适需求,因它具有很多XSLT的从潜在的异构数据源中转换数据的功能。
下面我来看一个利用XQuery实现文档转换的例子,它能将XML文档的属性转换为元素示。是一个作为输入的原XML文档,它描述了订单项目。
<Order id="1000001">
<item id="111" qty="10"/>
<item id="123" qty="28"/>
<item id="135" qty="16"/>
</Order>
下面是实现转换功能所用到的Xquery句。它只是简单的改原文档的构,加上了一些
元素。
let $order:=document("l")/Order
return
<PurchaseOrder>
<Order>{$order/@id}</Order>
<LineItems>{
for $Item in $order/item
return
<Item>
<Id>{string($Item/@id)}</Id>
<Qty>{string($Item/@qty)}</Qty>
</Item> }
</LineItems>
</PurchaseOrder>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。