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


    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":

    <bookstore>
    <book category="COOKING">
    <title lang="en">Everyday Italiantitle>
    <author>Giada De Laurentiisauthor>
    <year>2005year>
    <price>30.00price>
    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 Starttitle>
    <title lang="en">Learning XMLtitle>

    使用 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>
    }

    上面的表达式选择了 bookstore 元素下的 book 元素中的所有 title 元素,并按字母顺序返回 title 元素。

    现在我们想要在我们的书店中将所有书名列成一个 HTML 列表。我们在 FLWOR 表达式中添加了

    • 标签:

      <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",则返回 元素,否则返回 元素。

      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
    • "{data($x/@category)}">{data($x/title)}li>
    • }
      ul>
      body>

      在上述示例中,根据书籍的类别向 HTML

    • 元素添加了一个类属性。

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

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

  • 相关阅读:
    关于深度图与鸟瞰图之间转换的问题
    NativeBuffering,一种高性能、零内存分配的序列化解决方案[性能测试续篇]
    YOLOX理论
    Java内部类
    知识库指南4.0|AIGC & Web3 & 元宇宙发展趋势的学习与实践指引
    中国背景音乐服务行业经营效益与竞争格局分析报告2022-2028年
    qsort函数
    博世集团启动量子数字孪生计划
    94. 二叉树的中序遍历(递归+迭代)
    LNMP架构搭建论坛
  • 原文地址:https://www.cnblogs.com/xiaowange/p/18146721