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.yiibai.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子句用於從搜尋結果中返回元素。