English 中文(简体)
XQuery - Quick Guide
  • 时间:2024-12-22

XQuery - Quick Guide


Previous Page Next Page  

XQuery - Overview

What is XQuery

质量是一种功能性语言,用于检索XML格式储存的信息。 可在XML文件、含有XML格式数据的关系数据库或XML数据库中使用Xery。 XQuery 3.0 是W3C从2014年4月8日起提出的建议。

The definition of XQuery as given by its Official documentation 如下:

XQuery is a standardized language for combining documents, databases, Web pages and almost anything else. It is very widely implemented. It is powerful and easy to learn. XQuery is replacing proprietary middleware languages and Web Apppcation development languages. XQuery is replacing complex Java or C++ programs with a few pnes of code. XQuery is simpler to work with and easier to maintain than many other alternatives.

Characteristics

    功能语言-XQuery 是检索/排序XML数据的一种语言。

    Analogous to-XQuery is to XML what is to database.

    XPath based - 食堂用XPath语通过XML文件航行。

    普遍接受 - 图书馆得到所有主要数据库的支持。

    W3C 标准 - 质量是W3C标准。

Benefits of XQuery

    利用XQuery,可以检索等级和表格数据。

    可将ery树和图形结构用于 que。

    可直接利用Xery查询网页。

    可直接利用Xery建立网页。

    食堂可用于改变Xml文件。

    以XML为基础的数据库和基于标的的数据库理想。 目标数据库比纯表格数据库更灵活、更强大。

XQuery - Environment Setup

本章详细阐述了如何在地方发展环境中建立图书馆。

我们正在使用一个公开的来源,即广泛使用的XQuery加工商Saxon Home Edition(Saxon-HE)。 该加工商支持XSLT 2.0、XQuery 3.0和XPath 3.0,并高度优化业绩。 Saxon 如果没有XML数据库,可使用Xery处理器。 我们用简单的XML文件作为我们的例子的数据库。

为了使用Saxon XQuery加工商,请在应用舱位中配备Saxon9he.jar、Saxon9-test.jar、Saxon9-un Pack、Saxon9-xqj.jar。 下载文件SaxonHE9-6-0-1J.zipSaxonHE9-6-0-1J.zip

Example

我们利用设在贾瓦的Saxon XQuery加工商测试书籍、xqy,该书载有对我国XML文件样本(即书本)的XQuery表述。

在这个例子中,我们看到如何撰写并处理一个问题,以获得价格超过30的书籍所有权要素。

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

books.xqy

for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title

XQueryTester.java

package com.tutorialspoint.xquery;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;

import com.saxonica.xqj.SaxonXQDataSource;

pubpc class XQueryTester {
   pubpc static void main(String[] args){
      try {
         execute();
      }
      
      catch (FileNotFoundException e) {
         e.printStackTrace();
      }
      
      catch (XQException e) {
         e.printStackTrace();
      }
   }

   private static void execute() throws FileNotFoundException, XQException{
      InputStream inputStream = new FileInputStream(new File("books.xqy"));
      XQDataSource ds = new SaxonXQDataSource();
      XQConnection conn = ds.getConnection();
      XQPreparedExpression exp = conn.prepareExpression(inputStream);
      XQResultSequence result = exp.executeQuery();
      
      while (result.next()) {
         System.out.println(result.getItemAsString(null));
      }
   }	
}

Steps to Execute XQuery against XML

E:javajavac XQueryTester.java

E:javajava XQueryTester

Output

你取得了以下成果:

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Understanding Example

    书籍是样本数据。

    书籍.xqy是XQuery的表述,将在书本上执行。 我们理解下一章的细节。

    一家设在 Java的XQuery Executor方案,读书记.xqy,转至XQuery表达程序器,执行该表述。 更正应作在印发的记录上,由有关的代表团成员一人署名,送交逐字记录处处长(C-178)。

XQuery - First Apppcation

Example

以下是XML文件样本,其中载有各书店的记录。

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

下面是一份Xquery文件样本,其中载有在上述XML文件中将要执行的询问。 目的是在价格大于30的地方获得XML节点的名称。

books.xqy

for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title

Result

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Verify Result

为核实结果,取代books.xqy。 (见

XQuery Expressions

让我们理解上述文中的每一条。

Use of functions

doc("books.xml")

c) 是用于确定XML来源的XQuery功能之一。 我们在这里通过“书刊”。 考虑到相对的道路,书刊《xml》应当走在书本上。 xqy is present.

Use of XPath expressions

doc("books.xml")/books/book

食堂主要使用XPath语,以找到需要搜索的XML的必要部分。 在此,我们选择了在书籍节日下提供的所有书籍节点。

Iterate the objects

for $x in doc("books.xml")/books/book

ery将Xml数据作为物体处理。 在上述例子中,X美元是选定的节点,而 lo子的收集则超过了节点。

Apply the condition

where $x/price>30

由于x美元是选定的代号,“/”用于获取所需要素的价值;“如果”条款被用于对搜索结果作出条件。

Return the result

return $x/title

由于x美元是选定的代号,“/”被用于获取所需要素、价格、所有权的价值;“回归”条款用于从搜索结果中收回这些要素。

XQuery - FLWOR

FLWOR是一个缩略语,可称为“在什么地方,由回归令”。 The following pst show what they account for in a FLWOR expression -

    选择收集所有节点。

    如果有 选择条件规定的节点。

    - 发布命令,根据标准发布公告。

Example

以下是XML文件样本,其中载有收集书籍的资料。 我们将使用FLWOR的表述,以超过30美元的价格收回这些书籍的标题。

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

The following Xquery document contained the query expression to be committed on the above XML document.

books.xqy

let $books := (doc("books.xml")/books/book)
return <results>
{
   for $x in $books
   where $x/price>30
   order by $x/price
   return $x/title
}
</results>

Result

<title lang="en">Learn XQuery in 24 hours</title>
<title lang="en">Learn .Net in 24 hours</title>

Verify Result

为核实结果,取代books.xqy。 (见

XQuery - HTML Format

也可以很容易地将XML文件变成一个超文本页。 探讨以下例子,以了解锡克文是如何做到的。

Example

我们将使用同样的书籍。 下面的例子使用XQuery从书本中提取数据,并制作一个载有所有书本名称及其各自价格的超文本表格。

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>70.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

下面是按上述XML文件实施的Xquery表述。

books.xqy

let $books := (doc("books.xml")/books/book)
return <table><tr><th>Title</th><th>Price</th></tr>
{
   for $x in $books   
   order by $x/price
   return <tr><td>{data($x/title)}</td><td>{data($x/price)}</td></tr>
}
</table>
</results>

Result

<table>
   <tr>
      <th>Title</th>
      <th>Price</th>
   </tr>
   <tr>
      <td>Learn XPath in 24 hours</td>
      <td>16.50</td>
   </tr>   
   <tr>
      <td>Learn Java in 24 Hours</td>
      <td>30.00</td>
   </tr>
   <tr>
      <td>Learn XQuery in 24 hours</td>
      <td>50.00</td>
   </tr>   
   <tr>
      <td>Learn .Net in 24 hours</td>
      <td>70.50</td>
   </tr>
</table>

Verify Result

为核实结果,取代books.xqy。 (见

XQuery Expressions

在这里,我们使用了以下崇高语句:

    (a) 评估所有权要素的价值的职能,以及

    {} 运营商将数据(a)视为功能。 如果没有使用{}操作员,那么数据()将作为正常文本处理。

XQuery - XPath

食堂符合要求。 它使用XPath语来限制XML收集的搜索结果。 关于如何使用XPath的更多详情,见XPath Tutorial

回顾我们以前曾用来拿到账簿清单的以下文字。

doc("books.xml")/books/book

XPath Examples

我们将使用这些书刊,并将其应用XQuery。

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author> 
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
   
</books>

我们在此发表了三本书,其中实现了展示价格价值超过30的图书名称的同样目标。

XQuery – Version 1

(: read the entire xml document :)
let $books := doc("books.xml")

for $x in $books/books/book
where $x/price > 30
return $x/title

Output

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

XQuery – Version 2

(: read all books :)
let $books := doc("books.xml")/books/book

for $x in $books
where $x/price > 30
return $x/title

Output

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

XQuery – Version 3

(: read books with price > 30 :)
let $books := doc("books.xml")/books/book[price > 30]

for $x in $books
return $x/title

Output

<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>

Verify the Result

为核实结果,取代books.xqy。 (见

XQuery - Sequences

持有量是订购的物品集,物品可以类似或不同类型。

Creating a Sequence

产生频率时使用括号,在引文中加插或翻版和编号。 也可以将XML要素用作顺序的项目。

XQuery Expression

let $items := ( orange , <apple/>, <fruit type="juicy"/>, <vehicle type="car">sentro</vehicle>, 1,2,3, a , b ,"abc")
let $count := count($items)
return
<result>
   <count>{$count}</count>
   
   <items>
      {
	     for $item in $items
         return <item>{$item}</item>
      }
   </items>
   
</result>

Output

<result>
   <count>10</count>
   <items>
      <item>orange</item>
      <item>
         <apple/>
      </item>
      <item>
         <fruit type="juicy"/>
      </item>
      <item>
         <vehicle type="car">Sentro</vehicle>
      </item>
      <item>1</item>
      <item>2</item>
      <item>3</item>
      <item>a</item>
      <item>b</item>
      <item>abc</item>
   </items>
</result>

Viewing the Items of a Sequence

序列项目可采用指数或数值,按顺序排列。 以上例子将顺序排列的项目逐个。 让我们看到其他两种行动方式。

XQuery Expression (Index)

let $items := (1,2,3,4,5,6)
let $count := count($items)
return
   <result>
      <count>{$count}</count>
      
      <items>
      {
         for $item in $items[2]
         return <item>{$item}</item>
      }
      </items>
      
   </result>

Output

<result>
   <count>6</count>
   <items>
      <item>2</item>
   </items>
</result>

XQuery Expression (Value)

let $items := (1,2,3,4,5,6)
let $count := count($items)
return
   <result>
      <count>{$count}</count>
      
      <items>
      {
         for $item in $items[. = (1,2,3)]
         return <item>{$item}</item>
      }
      </items>
      
   </result>

Output

<result>
   <count>6</count>
   <items>
      <item>1</item>
      <item>2</item>
      <item>3</item>
   </items>
</result>

XQuery - Sequence Functions

下表列出了XQuery提供的常用序列功能。

Sr.No Name & Description
1

count($seq as items()*

这些项目按顺序排列。

2

sum(按项目(*)计算)

这些项目的总和按顺序排列。

3

.avg ($seq as items()*

这些项目的平均数按顺序排列。

4

min(按项目(*)计算)

每一次退还最低价值物品。

5

max(按项目(*)计算)

依次退还最高价值物品。

6

单独价值(作为项目()*

回返从顺序选择不同的项目。

7

subsequence ($seq as items()*,startingLoc as xs:double,$length as xs:double)

回归按规定顺序排列的次数。

8

insert-ati ($seq as items()*, position as xs:integer,$inserts as items()*

逐项增加一个项目。

9

remove ($seq as items ()*,$position as xs:integer)

从顺序上删除一个项目。

10

reverse($seq as items()*

回归顺序倒置。

11

index-of ($seq as any AtomicType()*,$target as anyAtomicType()

回归指数是按顺序显示某一项目的可用性。

12

last()

回归后按顺序表述的最后一项内容。

13

position()

在妇女权利论坛中,有人表示要按顺序处理一个项目。

XQuery - String Functions

下表列出了XQuery提供的常用操纵功能。

Sr.No Name & Description
1

string-length ($string as xs:string) as xs:integer

体积的长度。

2

concat ($input as xs:anyAtomicType?) as xs:string

将压缩体归为产出。

3

string-join($sequence as xs:string*,$depmiter as xs:string) as xs:string

逐项归还,顺序由划界人分开。

XQuery - Date Functions

下表列出了XQuery提供的通用日期职能。

Sr.No Name & Description
1

,当期()。

日期待定。

2

恢复目前的时间。

3

/xquery/xquery_ Current_datetime.htm> 现行时间()

既包括目前的日期,也包括现在的时间。

XQuery - Regular Expressions

以下是XQuery提供的常用经常表达功能清单。

Sr.No Name & Description
1

matches($input,$regex)

如果投入与提供的定期表述相匹配,则回报是真实的。

2

replace(投入费用、控制费用、费用)

用特定载体取代对应投入。

3

tokenize($input,$regex)

回归一系列与正常表述相匹配的项目。

XQuery - If Then Else

食堂为检查所传递的投入价值是否有效提供了非常有用的假造。 下面是“三轮”建筑的星号。

Syntax

if (condition) then
 ... 
else
 ... 

Example

我们将使用以下书本。

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book category="JAVA">
      <title lang="en">Learn Java in 24 Hours</title>
      <author>Robert</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   
   <book category="DOTNET">
      <title lang="en">Learn .Net in 24 hours</title>
      <author>Peter</author>
      <year>2011</year>
      <price>40.50</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XQuery in 24 hours</title>
      <author>Robert</author>
      <author>Peter</author>
      <year>2013</year>
      <price>50.00</price>
   </book>
   
   <book category="XML">
      <title lang="en">Learn XPath in 24 hours</title>
      <author>Jay Ban</author>
      <year>2010</year>
      <price>16.50</price>
   </book>
</books>

The following XQuery expression is to be used on the above XML document.

books.xqy

<result>
{
   if(not(doc("books.xml"))) then (
      <error>
         <message>books.xml does not exist</message>
      </error>
   )
   else ( 
      for $x in doc("books.xml")/books/book	
      where $x/price>30
      return $x/title
   )
}
</result>

Output

<result>
   <title lang="en">Learn .Net in 24 hours</title>
   <title lang="en">Learn XQuery in 24 hours</title>
</result>

Verify the Result

为核实结果,取代books.xqy。 (见

XQuery - Custom Functions

食堂提供撰写习俗功能的能力。 下面列出的是建立习惯功能的准则。

    利用关键词宣布职能界定职能。

    1. 使用现行XML Schema定义的数据类型

    • 在毛皮内安装功能。

    用XML名称空间确定该功能的名称。

The following syntax is used同时创设一项习俗功能。

Syntax

declare function prefix:function_name($parameter as datatype?...)
as returnDatatype?
{
   function body...
};

Example

以下例子说明了如何在XQuery建立用户界定的职能。

XQuery Expression

declare function local:discount($price as xs:decimal?,$percentDiscount as xs:decimal?)
as xs:decimal? {
   let $discount := $price - ($price * $percentDiscount span 100) 
   return $discount
};

let $originalPrice := 100

let $discountAvailed := 10

return ( local:discount($originalPrice, $discountAvailed)) 

Output

90

Verify the Result

为核实结果,取代books.xqy。 (见

Advertisements