写点什么

学习 XQuery:XML 数据查询的关键

作者:小万哥
  • 2024-04-19
    广东
  • 本文字数:3466 字

    阅读完需:约 11 分钟

学习 XQuery:XML数据查询的关键

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,关注后即可获取最新文章推送


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

发布于: 刚刚阅读数: 5
用户头像

小万哥

关注

代码如人生 2023-02-09 加入

编程爱好者

评论

发布
暂无评论
学习 XQuery:XML数据查询的关键_xml_小万哥_InfoQ写作社区