3

学习 XQuery:XML数据查询的关键 - 小万哥丶

 1 week ago
source link: https://www.cnblogs.com/xiaowange/p/18146721
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

XQuery 是 XML 数据的查询语言,类似于 SQL 是数据库的查询语言。它被设计用于查询 XML 数据。

XQuery 示例

for $x in doc("books.xml")/bookstore/bookwhere $x/price > 30order by $x/titlereturn $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/bookwhere $x/price>30return $x/title
<title lang="en">XQuery Kick Start</title><title lang="en">Learning XML</title>

使用 FLWOR,您可以对结果进行排序:

for $x in doc("books.xml")/bookstore/bookwhere $x/price>30order by $x/titlereturn $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/bookreturn 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/bookwhere $x/price>30order by $x/titlereturn $x/title

在上述表达式中:

  • for 子句将每个书籍绑定到变量 $x
  • where 子句过滤出价格大于 30 的书籍。
  • order by 子句按标题排序结果。
  • return 子句指定返回书籍的标题。

for 子句

for 子句将一个变量绑定到由 in 表达式返回的每个项目。在同一个 FLWOR 表达式中可以有多个 for 子句。

for $x at $i in doc("books.xml")/bookstore/book/titlereturn <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 100return ($p - $disc)};

以下是如何调用上述函数的示例:

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

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎点赞、收藏、关注


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK