XQuery(XML查询语言)介绍一

Posted on 2006-03-10 08:12  太阳天子  阅读(764)  评论(0)    收藏  举报

September 14, 2003

XQuery(XML查询语言)介绍一

文章一共分为四部分,原文来自Devx.com,时间是去年的10月。本文的翻译未经原作者授权,这里只是作为私下的学习笔记译出。

作者: Srinivas Pandrangi 和 Alex Cheng et al.
来源:http://www.devx.com

XML模糊了数据库、文档、和消息之间的界线,但是,要充分发挥XML的所有潜能,还必须要有一个强大的、优雅的查询语言。XPath还远不够。 XQuery正在试图成为所需的语言。

过去几年里,在以文档为中心和以数据为中心的环境里,作为信息的一种格式化语言,XML迅速得到了广泛的欢迎。XML基础规范(XML-based standards)爆炸似的增长表明XML受到了许许多多不同技术联盟(communities)的关注。现在,许多应用程序使用XML来传送消息,如SOAP或者XML-RPC消息;或者作为数据的永久性存储,如XML数据库、内容管理系统。一个以XML为基础的web,将替代以HTML为基础的web听起来不在是幻想了。

随着存储在XML文档中的信息量的增长,能有效并且高效的存取XML的信息相应的也变得越来越重要。要做到这一点,必须要有一个让你能够准确的获得所需信息、更新XML数据源中数据的可表达的查询语言。XQuery正是这样的语言。

在这里,这个分为四个部分的系列文档的第一部分将向你介绍XQuery查询语言。我们将为你解释XQuery的基本概念,如查询表达的不同类型、语言要素、用户自定义函数,并将通过实例展示它们的用法。

例子说明

在这个系列文章中,我们将用基于一个对大多数开发人来说都很熟悉的单一方案的一系列例子来说明XQuery的概念。我们将用到包含下面三种类型文档的订单处理应用:购买订单 po.xml、客户列表customers.xml和产品列表items.xml。对那些熟悉关系数据库的读者来说文档(po.xml)类似一个购买订单表(表中的每一条记录代表一个购买订单,如同此XML文档中的每一个 元素代表一个订单);文档(customers.xml)类似于客户表;文档items.xml 等价于产品目录表。这些类似可以帮助你比较XQuery和SQL的性能。

XQuery概览

XQuery是一个让你从XML格式的文档中获取数据项的查询语言。目前,它还未被“完成”— 它还是W3C's XML Query working group赞助下的一个正在处理的工作。The XML Query working group在2001十二月20日发布了最近公开的XQuery规范工作草案(Http://www.w3g.org/TR/xquery),本系列文章使用的正是这一版本的规范。(注:目前最新版本是今年8月20日)

XQuery模块结构

如果你熟悉如SQL、OQL等其他查询语言,你会注意到XQuery有一些相似,你可能还将发现一些语法非常熟悉。在这个文章里,术语“query module”被用作“query unit”。你能想象得出XQuery模块包括三个部分(参看图一

名字空间和模式声明(Namespace and Schema Declarations) [可选]
函数定义[可选]
查询表达式

表一:查询模块的三个部分

头两个部分合在一起叫做查询序(query prolog)。 第一部分可以用名字空间声明和模式引入语句组成。表一中的例子定义了名字空间前缀“xsd”映射到URI http://www.w3.org/2000/01/XMLSchema。 第二部分包含了函数定义。这是放置自定义函数的地方。表一的例子定义了一个阶乘函数:接受一个整数参数,返回它的阶乘。

查询的第三部分包含了查询语法(query expressions)。 语法是XQuery的关键。表一的例子使用了一个叫做元素构造者(Element Constructor)的语法。如同名字所提示的,构造了一个名字为“Results”的元素。例子中执行了参数为10的阶乘函数,并且函数的结果成为元素“Value” 的内容。

XQuery语法速览

每一个XQuery查询包括一个或多个查询表达式。以下是一些常用的XQuery语法:FLWR Expressions, Path Expressions, Element Constructors, Conditional Expressions, and Function Calls。

这里简单的介绍一些语法先让你有个了解,在后面的文章中我们将做更多的介绍。

FLWR语法

FLWR语法(读作“flower”)是XQuery最有趣的语法类型之一。它们看上去和SQL的select 语句类似,并且具有相似的功能。FLWR代表“For-Let-Where-Return“,它包含了四个子句。下面的FLWR语法例子获取XML文档(items.xml)中所有价格低于平均价格的所有项。

# See XQuery12.ixq in samples.zip

for $i in document("data/items.xml")//item

let $avg_price :=

avg(document("data/items.xml")//item/price)

where $i/price < $avg_price

return

{$i/itemno, $i/description, $i/price}

for子句捆绑变量“i”到XML文档items.xml中的item元素列表。let子句计算所有item项的平均价格。where子句选择所有for子句限制的item中价格低于平均价格的item项。Return 子句构建包含被选择item的itemno, description and price的 LowPricedItem 元素。

FLWR语法非常地通用,在后面的文章中你将更多的看到它们。

Path语法

在XQuery中, Path就是XPath 2.0的语法。它们使用path标记从XML文档中选择感兴趣的节点。如同在这一系列文章“Data Model ”一节中描述的,你能把XML文档看作是节点树。一个path语法描述了浏览这个节点树从而找到感兴趣的节点的方式。

例如,下面这个path表达式在items.xml中识别了所有具有同样父items 元素的item元素。

# see XQuery13.ixq in samples.zip

namespace ixq="http://www.ipedo.com/XQueryExample"

document("data/items.xml")/ixq:items/item

在path表达中,通过传入谓语(条件),你可以使之更具选择性。例如,查找所有itemType 为“Purchasing item”的item,你可以使用如下的path表达:

# see XQuery14.ixq in samples.zip

namespace ixq="http://www.ipedo.com/XQueryExample"

document("data/items.xml")/ixq:items/item[ItemType = "Purchasing item"]

Element构建者

在写查询的时候,你可能需要创建新的元素作为输出的一部分。Element构建者(constructors)正是提供这样的功能。一个简单的元素构件的例子如下:

Hello World

这个例子构造了一个名字是newElement 的元素,它包含一个值为“Hello World”子文本节点。

你不必为新的元素选择存在的内容,你可以用任意的或者是计算的结果作为新元素的内容。下面这个元素构建者创建了一个名字为“MyListOfExpensiveItems”的元素,它包含了文档 items.xml 中价格超过$1000.00的所有item 元素。

# see XQuery15.ixq in samples.zip

namespace ixq="http://www.ipedo.com/XQueryExample"

{document("data/items.xml")/ixq:items/item[price > 1000]}

空白(Whitespace)

除了以下这些例外,空白不具有含义,不是重要的:

元素构建者中的空白(Whitespace)是受保护的。
封闭表达式中的空白,如{expr} 是受保护的。
除了出现在谓语外,空白不允许出现在path表达式中,例如 /items/item[name = "scooter"] 。谓语([]封闭的部分 )能包含空白,但是path表达式的其余部分不能。
条件语法(Conditional)

条件表达式的语法格式如下:

if <条件表达式>

then <表达式一>

else <表达式二>

在条件表达中,条件表达式应当赋值为Boolean值,或者是一个能被转换为Boolean的类型。如果Boolean值是true,整个条件表达的结果的值和表达式一的值一样。否则和表达式二一致。

定量(Quantified)语法

定量表达使用some或者every。Every定量表达赋值给一个Boolean值。下面的例子展示了两种定量表达的用法。

# see XQuery16.ixq in samples.zip

# returns purchase orders that only contain

# items cheaper than $300

namespace ns = "http://www.ipedo.com/XQueryExample"

for $i in document("data/PO.xml")/ns:polist/po

where every $p in

$i/lineitems/lineitem/item/price

satisfies ($p < 300)

return $i

for 子句返回po.xml文档中所有购买订单元素。Where子句使用定量表达来选择那些每一个item的价格均小于$300的订单元素。

# see XQuery17.ixq in samples.zip

#returns all purchase orders which contain at

#least one item priced more than $200

namespace ns = "http://www.ipedo.com/XQueryExample"

for $i in document("data/PO.xml")/ns:polist/po

where some $p in $i/lineitems/lineitem/item/price satisfies ($p > 200)

return $i

象前一个查询例子,for 子句子句返回po.xml文档中所有购买订单元素。这一次,where 子句使用一个定量表达来选择那些至少有一个item的价格在$200.00以上的购买订单。

现在,你对XQuery该有了一个大概的了解。我们将在下一节里介绍XQuery的数据模型,基本的语言特征,还有Path表达更深入的描述。

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3