XQuery入门程序

以下是一个示例XML文档,其中包含各种书籍的记录。

文件:books.xml 的文件内容如下 -

<?xml version=1.0 encoding=UTF-8?>
<books>

   <book category=JAVA>
      <title lang=en>15天搞定Java</title>
      <author>Maxsu</author>
      <year>2015</year>
      <price>30.00</price>
   </book>

   <book category=DOTNET>
      <title lang=en>15天搞定.Net</title>
      <author>Susen</author>
      <year>2018</year>
      <price>40.50</price>
   </book>

   <book category=XML>
      <title lang=en>3天搞定XQuery</title>
      <author>Yizhi</author>
      <author>Maxsu</author> 
      <year>2016</year>
      <price>50.00</price>
   </book>

   <book category=XML>
      <title lang=en>24小时搞定XPath</title>
      <author>Jazz Bee</author>
      <year>2019</year>
      <price>16.50</price>
   </book>

</books>

以下是一个示例Xquery文档,其中包含要在上述XML文档上执行的查询表达式。 目的是获取价格大于30的那些XML节点<title>元素。

文件:books.xqy 的内容如下 -

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

文件:XQueryTester.java 的内容如下 -

//package com.jb51.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;

public class XQueryTester {
   public 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));
      }
   }    
}

执行上面示例代码(XQueryTester.java),得到以下结果 -

<title lang=en>15天搞定.Net</title>
<title lang=en>3天搞定XQuery</title>

要验证结果,请将books.xqy的内容(在XQuery环境设置一章中给出)替换为上面的XQuery表达式,然后执行XQueryTester.java程序。

XQuery表达式

下面让我们理解上面XQuery表达式中代码的每一部分,使用函数 -

doc(books.xml)

doc()是用于定位XML源的XQuery函数。 这里通过指定 - books.xml 。 考虑到相对路径,books.xml 应该位于books.xqy 所在的相同路径中。

使用XPath表达式

doc(books.xml)/books/book

XQuery大量使用XPath表达式来定位要进行搜索的XML所需部分。 在这里,选择了books节点下的所有<book>节点。

迭代对象

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

XQuery将xml数据视为对象。 在上面的示例中,$x表示所选节点,而for循环遍历节点集合。

应用条件

where $x/price>30

由于$x代表所选节点,/用于获取所需元素的值; where子句用于在搜索结果上添加条件。

返回结果

return $x/title

由于$x代表所选节点,/用于获取所需元素 - pricetitle的值; return子句用于从搜索结果中返回元素。