学习 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
,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注
学习 XQuery:XML数据查询的关键的更多相关文章
- T-SQL XQuery (XML路径查询) (转)http://blog.csdn.net/Beirut/article/details/8150116
/* T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集. XQuery 基于现有的 XPath 查询语言,并支持更好的迭代.更好的排序结果以及构造必需的 XML 的功能. 在前面 ...
- 带名称空间的xml数据查询
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="MapSource 6.5" versio ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- (四)SAX方式解析XML数据
SAX方式解析XML数据 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程 ...
- 网络相关系列之四:数据解析之SAX方式解析XML数据
一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据 ...
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据
XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你 ...
- Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集
XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB&qu ...
- Ajax跨域访问XML数据的另一种方式——使用YQL查询语句
XML数据默认是不能在客户端通过Ajax跨域请求读取的,一般的做法是在服务器上写一个简单的代理程序,将远程XML的数据先读到本地服务器,然后客户端再从本地服务器通过Ajax来请求.由于我们不能对数据源 ...
- SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除
/*------------------------------------------------------------------------------+ #| = : = : = : = : ...
- 转载---SQL Server XML基础学习之<7>--XML modify() 方法对 XML 数据中插入、更新或删除
/*------------------------------------------------------------------------------+ #| = : = : = : = : ...
随机推荐
- Error running 'Tomcat 8.5.27': Unable to open debugger port (127.0.0.1:2887): java.net.SocketException "Interrupted function call: accept failed"-火绒安全搞的鬼
火绒安全-导致的tomcat8启动异常 一.问题由来 最近有个朋友在学习使用IDEA配置tomcat 8.5.99的时候,使用一切都正常,直到学习到使用Servlet实现文件 下载功能的时候,出现问题 ...
- 分布式理论 & RPC & Dubbo
分布式服务框架(RPC) 用于提高机器利用率的资源调度和治理中心*(SOA)[ Service Oriented Architecture] Dubbo(RPC框架) 服务提供者**(Provider ...
- 摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 - 然后F4 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件
摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件 F1的设置可能在其他贴子了 最新特大好消息 F4 是搜索完的跳转 等于F1 ...
- day32-JQuery05
jQuery05 9.作业 9.1homework01 对多选框进行操作,输出选中的多选框的个数,并且把选中爱好的名称显示. <!DOCTYPE html> <html lang=& ...
- 如何在UE4中播放本地视频文件?
在UE4中有一套媒体框架方法,它根据视频源的不同,对应的播放方式也不一样,支持的视频源有本地视频文件.影像序列.视频流.实时视频截图.播放形式可选择在场景内的静态网格上播放或者以UI的形式播放.本文主 ...
- 上位机连接PLC
上位机使用Hsl框架连接PLC 顺便讲下策略模式 话不多说,直接上代码 public interface IPlcHost { bool ConnectionPlc(string path); } p ...
- 再见了 Pages
再见 Pages 之前一直用 GitHub Pages + Hexo 写博客,但是这段时间又出现了无法访问的问题,非常闹心,于是想把博客迁移到博客园,继续简简单单地写东西 挺感激 Pages ,这个博 ...
- AndroidStudio配置 | 菜鸟教程
https://www.runoob.com/android/android-studio-install.html
- #线段树分治,背包#CF601E A Museum Robbery
题目 有 \(n\) 个展品正在被展览,每一个展品都有一价值 \(v\) 个和一个混乱度 \(w\) ,现在有 \(m\) 次操作: 1 \(v\) \(w\) :加入一个新的展品,价值为\(v\), ...
- #dp#洛谷 5774 [JSOI2016]病毒感染
题目 分析 此题肯定不是绿题,哪有这么恶心的dp 试想这样的情形:假设当 JYY 第一次抵达村庄 \(i\),未作救治并直接前往了另一个村庄.那么由于 \(i\) 村庄的人们求生心切, 一旦当 JYY ...