學習 XQuery:XML資料查詢的關鍵

小万哥丶發表於2024-04-19

XQuery 是 XML 資料的查詢語言,類似於 SQL 是資料庫的查詢語言。它被設計用於查詢 XML 資料。

XQuery 示例

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

XQuery 的特點

  • XQuery 是查詢 XML 資料的語言,用於 XML 就像 SQL 用於資料庫一樣。
  • 它是基於 XPath 表示式構建的
  • 它是一種從 XML 文件中查詢和提取元素和屬性的語言。

XQuery 和 XPath

XQuery 1.0 和 XPath 2.0 共享相同的資料模型,並支援相同的函式和運算子。因此,如果您已經學習了 XPath,那麼理解 XQuery 就不會有太大問題。

XQuery 的應用

XQuery 可用於以下情況:

  • 提取資訊以用於 Web 服務
  • 生成摘要報告
  • 將 XML 資料轉換為 XHTML
  • 搜尋 Web 文件以獲取相關資訊

XQuery 示例

讓我們透過看一個示例學習一些基本的 XQuery。

XML 示例文件

我們將在下面的示例中使用以下 XML 文件 "books.xml":

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <!-- 其他書籍 -->
</bookstore>

如何從 "books.xml" 中選擇節點?

XQuery 使用函式和路徑表示式來從 XML 文件中提取資料。

函式

使用 doc() 函式來開啟 "books.xml" 檔案:

doc("books.xml")

路徑表示式

使用路徑表示式來導航 XML 元素:

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

上面的路徑表示式選擇了 "books.xml" 檔案中的所有 title 元素。

謂詞

使用謂詞來限制從 XML 文件中提取的資料:

doc("books.xml")/bookstore/book[price<30]

上面的 XQuery 將提取價格小於 30 的所有書籍。

總結

XQuery 是一種強大的 XML 查詢語言,可用於在 XML 文件中查詢和提取資訊

XQuery FLWOR 表示式

什麼是 FLWOR

FLWOR 是一個縮寫,代表 "For, Let, Where, Order by, Return",它是一種用於在 XQuery 中進行資料處理的表示式。

  • For:選擇一系列節點。
  • Let:將一個序列繫結到一個變數。
  • Where:過濾節點。
  • Order by:對節點排序。
  • Return:返回結果(對每個節點進行一次評估)。

如何使用 FLWOR 從 "books.xml" 中選擇節點?

考慮以下路徑表示式:

doc("books.xml")/bookstore/book[price>30]/title

上面的表示式選擇了 bookstore 元素下的 book 元素中,其 price 元素的值高於 30 的所有 title 元素。

以下 FLWOR 表示式將選擇與上面的路徑表示式完全相同的結果:

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

結果將是

<title lang="en">XQuery Kick Start</title>
<title lang="en">Learning XML</title>

使用 FLWOR,您可以對結果進行排序:

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

XQuery FLWOR + HTML

將結果顯示為 HTML 列表

考慮以下 XQuery FLWOR 表示式:

<ul>
{
  for $x in doc("books.xml")/bookstore/book/title
  order by $x
  return <li>{$x}</li>
}
</ul>

上面的表示式選擇了 bookstore 元素下的 book 元素中的所有 title 元素,並按字母順序返回 title 元素。

現在我們想要在我們的書店中將所有書名列成一個 HTML 列表。我們在 FLWOR 表示式中新增了 <ul><li> 標籤:

<ul>
{
  for $x in doc("books.xml")/bookstore/book/title
  order by $x
  return <li>{$x}</li>
}
</ul>

現在我們想要消除 title 元素,並只顯示 title 元素內的資料:

<ul>
{
  for $x in doc("books.xml")/bookstore/book/title
  order by $x
  return <li>{data($x)}</li>
}
</ul>

結果將是一個 HTML 列表,顯示了書籍的名稱。

XQuery 術語

  • 節點:在 XQuery 中,有七種型別的節點:元素、屬性、文字、名稱空間、處理指令、註釋和文件(根)節點。
  • 原子值:沒有子節點或父節點的節點。
  • 專案:原子值或節點。
  • 節點的關係:父節點、子節點、兄弟節點、祖先節點和後代節點。

XQuery 語法

XQuery 基本語法規則

XQuery 是區分大小寫的,同時要求元素、屬性和變數必須是有效的 XML 名稱。

  • XQuery 區分大小寫。
  • XQuery 元素、屬性和變數必須是有效的 XML 名稱。
  • XQuery 字串值可以使用單引號或雙引號括起來。
  • XQuery 變數以 $ 開頭,後跟一個名稱,例如 $bookstore
  • XQuery 註釋使用 (::) 進行界定,例如 (: XQuery 註釋 :)

XQuery 條件表示式

XQuery 支援使用 "If-Then-Else" 表示式。

示例

for $x in doc("books.xml")/bookstore/book
return if ($x/@category="children")
       then <child>{data($x/title)}</child>
       else <adult>{data($x/title)}</adult>

在上述示例中,如果 $x/@category 的值是 "children",則返回 <child> 元素,否則返回 <adult> 元素。

XQuery 比較

在 XQuery 中,可以使用通用比較(=, !=, <, <=, >, >=)和值比較(eq, ne, lt, le, gt, ge)。

XQuery 新增元素和屬性

XQuery 可以用於向結果中新增元素和屬性。

示例

<html>
<body>

<h1>書店</h1>

<ul>
{
  for $x in doc("books.xml")/bookstore/book
  order by $x/title
  return <li class="{data($x/@category)}">{data($x/title)}</li>
}
</ul>

</body>
</html>

在上述示例中,根據書籍的類別向 HTML <li> 元素新增了一個類屬性。

XQuery 選擇和過濾

XML 示例文件

在瀏覽器中檢視 "books.xml" 檔案。

選擇和過濾元素

FLWOR 表示式

FLWOR(For, Let, Where, Order by, Return)表示式是一種結構化的查詢語言,用於對 XML 資料進行操作。

以下是一個 FLWOR 表示式的示例,透過選擇價格大於 30 的書籍,並按標題排序:

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

在上述表示式中:

  • for 子句將每個書籍繫結到變數 $x
  • where 子句過濾出價格大於 30 的書籍。
  • order by 子句按標題排序結果。
  • return 子句指定返回書籍的標題。

for 子句

for 子句將一個變數繫結到由 in 表示式返回的每個專案。在同一個 FLWOR 表示式中可以有多個 for 子句。

示例:

for $x at $i in doc("books.xml")/bookstore/book/title
return <book>{$i}. {data($x)}</book>

在上述示例中,透過 at 關鍵字獲取迭代次數,並返回帶有索引的書籍標題。

let 子句

let 子句允許變數賦值,並且可以避免重複多次相同的表示式。let 子句不會導致迭代。

示例:

let $x := (1 to 5)
return <test>{$x}</test>

在上述示例中,let 子句建立變數 $x,並將其賦值為 1 到 5 的序列。

where 子句

where 子句用於指定結果的一個或多個條件:

where $x/price>30 and $x/price<100

在上述示例中,where 子句篩選出價格在 30 到 100 之間的書籍。

order by 子句

order by 子句用於指定結果的排序順序:

order by $x/@category, $x/title

在上述示例中,order by 子句按照類別和標題對結果進行排序。

return 子句

return 子句指定要返回的內容:

return $x/title

在上述示例中,return 子句返回書籍的標題

XQuery函式

XQuery基於XPath表示式。XQuery 1.0和XPath 2.0共享相同的資料模型,並支援相同的函式和運算子。

XPath運算子

XPath函式

您還可以在XQuery中定義自己的函式

XQuery資料型別

XQuery共享與XML Schema 1.0(XSD)相同的資料型別。

  • XSD字串

  • XSD日期

  • XSD數值

  • XSD雜項

函式呼叫示例

函式呼叫可以出現在表示式可以出現的地方。請檢視下面的示例:

示例1:在元素中

<name>{`upper-case($booktitle)`}</name>

示例2:在路徑表示式的謂詞中

doc("books.xml")/bookstore/book[substring(title, 1, 5) = 'Harry']

示例3:在let子句中

let $name := (substring($booktitle, 1, 4))

XQuery使用者定義的函式

如果找不到您需要的XQuery函式,您可以編寫自己的函式。

使用者定義的函式可以在查詢中或在單獨的庫中定義。

語法

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

有關使用者定義函式的注意事項:

  • 使用declare function關鍵字
  • 函式的名稱必須有字首
  • 引數的資料型別大多與XML Schema中定義的資料型別相同
  • 函式的主體必須用大括號括起來

在查詢中宣告的使用者定義函式示例

declare function local:minPrice($p as xs:decimal?, $d as xs:decimal?)
as xs:decimal?
{
let $disc := ($p * $d) div 100
return ($p - $disc)
};

以下是如何呼叫上述函式的示例:

<minPrice>{`local:minPrice($book/price, $book/discount)`}</minPrice>

最後

為了方便其他裝置和平臺的小夥伴觀看往期文章:

微信公眾號搜尋:Let us Coding,關注後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關注

相關文章