学习 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”:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

与上级意见不合时如何恰当地表达自己的观点?

在工作中与上级意见不合时&#xff0c;恰当表达自己的观点并寻求共识是一个需要谨慎处理的问题。以下是一些建议&#xff1a; 1. **尊重与礼貌**&#xff1a;在任何情况下&#xff0c;都应保持对上级的尊重和礼貌。即使在意见不合时&#xff0c;也要避免情绪化&#xff0c;保持…

简单二分应用

思路&#xff1a;首先二分需要数列有二分性&#xff0c;我们要对数列排序&#xff0c;然后二分距离&#xff0c;直到出现一个距离可以满足&#xff0c;点数大于等于k。 代码&#xff1a; void solve(){int n, q;cin >> n >> q;vector<int>a(n);for(int i …

代码随想录:二叉树11-12

目录 222.完全二叉树的节点个数 题目 代码&#xff08;层序迭代&#xff09; 代码&#xff08;后序递归&#xff09; 代码&#xff08;满二次树递归&#xff09; 总结 110.平衡二叉树 题目 代码&#xff08;后序递归&#xff09; 代码&#xff08;层序迭代&#xff0…

设置表格高度后,数值改变但实际不变

1.选中表格 2.点击“开始”——>“段落设置”的选项启动按钮&#xff0c;设置为单倍行距 3.可以看到&#xff0c;表格的行高被调小了。

如何高效建立企业绩效评估体系?这家世界500强企业用BI工具这么做

在目前经济下行&#xff0c;竞争激烈&#xff0c;向精细化管理要效益的社会背景下&#xff0c;如何对资金结算部门做好绩效管理&#xff0c;以保障组织的正常运作&#xff0c;是各大企业面对的重要痛点。 本文将基于某世界500强公司的财务共享资金结算部门的绩效管理办法&…

河北专升本(c语言各种编程题)

目录 第一类、递归调用 第二类、特殊数字 第三类、多维数组 第四类、字符处理 第五类、数学问题 第六类、排序算法 第七类、循环问题 第八类、进制转换 第九类、实际应用 第十类、图形输出 第一类、递归调用 1.汉诺塔&#xff1a;请输入盘子数&#xff0c;输出盘子移动…

海外媒体如何发布软文通稿

大舍传媒-带您了解海外发布新潮流 随着全球化的不断深入&#xff0c;越来越多的中国企业开始关注海外市场。为了在国际舞台上树立品牌形象&#xff0c;企业纷纷寻求与海外媒体合作&#xff0c;通过发布软文通稿的方式&#xff0c;传递正面信息&#xff0c;提升品牌知名度。作为…

【4071】基于小程序实现的活动报名管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

抹机王的使用教程以及常见问题

首先请确保你已经正常安装了XPosed/EDXP/LSP框架并已激活抹机王模块&#xff0c;其中XP和EDXP模块均只需要框架内激活抹机王并重启即可&#xff0c;LSPosed注意作用域需要勾选上自己想要修改的APP&#xff08;如果你还是一意孤行只勾选系统框架那改机完全没用就是你自己的想法了…

设计模式之模板方法模式详解(下)

3&#xff09;钩子方法的使用 1.概述 钩子方法的引入使得子类可以控制父类的行为。 2.结构图 3.代码实现 将公共方法和框架代码放在抽象父类中 abstract class DataViewer {//抽象方法&#xff1a;获取数据public abstract void GetData();//具体方法&#xff1a;转换数据…

每日一题 — 最小覆盖子串

76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;暴力遍历哈希表 解法二&#xff1a;滑动窗口哈希表 定义left和right初始化为零&#xff0c;固定left&#xff0c;先向右遍历right&#xff0c;放到哈希表中这个时候我们需要统计有效字符的个数&…

深入挖掘C语言 ---- 文件操作

目录 1. 文件的打开和关闭1.1 流和标准流1.1.1流1.1.2标准流 1.2 文件指针1.3 文件的打开和关闭 2. 顺序读写3. 随机读写3.1 fseek3.2 ftell3.3 rewind 4. 读取结束判定 正文开始 1. 文件的打开和关闭 1.1 流和标准流 1.1.1流 我们程序的数据需要输出到各种外部设备, 也需要…

Leetcode算法训练日记 | day30

一、重新安排行程 1.题目 Leetcode&#xff1a;第 332 题 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发…

java算法day2

螺旋矩阵搜索插入位置查找元素第一个位置和最后一个位置 螺旋矩阵 解法&#xff1a;模拟&#xff0c;核心在于你怎么转&#xff0c;还有就是处理边界&#xff0c;边界如何收缩&#xff0c;什么时候停止旋转。最内圈的时候怎么处理。 通过上图的模拟来解决这个问题&#xff1a;…

数据库锁等待排查方法、命令行安装数据库及授权文件更新

欢迎关注“数据库运维之道”公众号&#xff0c;一起学习数据库技术! 本期将为大家分享“数据库锁等待排查方法、命令行安装数据库及授权文件更新”的运维技能。 关键词&#xff1a;锁等待、V$LOCK、V$TRXWAIT、死锁、锁超时、命令行部署达梦、授权文件更新 当用户反馈执行SQL语…

1985-2022年各地级市专利申请数据

1985-2022年各地级市专利申请数据 1、时间&#xff1a;1985-2022年 2、指标&#xff1a;行政区划代码、地区、省份、城市、年份、发明公布&#xff08;申请数&#xff09;、其中&#xff1a;获得授权、外观设计申请量、实用新型申请量 3、来源&#xff1a;国家知识产权局 4…

【Java】简单实现图书管理系统

前言 在本篇博客当中&#xff0c;我们会使用Java基础语法来简单实现一个图书管理系统&#xff0c;主要用到的知识为&#xff1a;封装、多态、继承、接口等等&#xff0c;并不会使用数据库来存储数据&#xff0c;请注意 需求 1. 要求设置管理员和普通用户两种身份&#xff0c…

【深度学习实战(9)】三种保存和加载模型的方式

一、state_dict方式&#xff08;推荐&#xff09; torch.save(model.state_dict(), PATH)model YourModel() model.load_state_dict(torch.load(PATH)) model.eval()记住一定要使用model.eval()来固定dropout和归一化层&#xff0c;否则每次推理会生成不同的结果。 二、整个…

实验室三大常用仪器3---交流毫伏表的使用方法(笔记)

目录 函数信号发生器、示波器、交流毫伏表如果连接 交流毫伏表的使用方法 测量值的读数问题 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器2---函数信号发生器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客…

C#自定义窗体更换皮肤的方法:创建特殊窗体

目录 1.窗体更换皮肤 2.实例 &#xff08;1&#xff09;图片资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#xff09; 生成效果 &#xff08;5&#xff09;一个遗憾 1.窗…
最新文章