XQuery是专为XML数据设计的声明式查询语言,功能类似SQL之于关系数据库,支持路径定位、谓词过滤、内置函数、命名空间及FLWOR表达式等核心特性。

XQuery 是专为查询和操作 XML 数据设计的声明式语言,作用类似 SQL 之于关系型数据库。它不是简单提取节点的工具,而是能遍历、过滤、排序、聚合、构造新结构的完整查询语言,原生理解 XML 的嵌套与层级特性。最新稳定版是 XQuery 3.1(2017 年发布),由 W3C 制定,广泛用于 eXist-db、BaseX、MarkLogic 等原生 XML 数据库,也支持在 SQL Server 等关系数据库中查询 xml 类型字段。
XQuery 查询 XML 数据的核心语法
所有查询都基于 XPath 路径表达式扩展而来,但比 XPath 更具表达力:
- 路径定位:如
/books/book/title获取所有书名;/books/book[price > 50]筛选高价书 - 谓词支持复杂条件:
/book[author = "李四" and price 、/book[contains(title, "XML")] - 常用内置函数:
upper-case()、count()、data()(取文本值)、string-length() - 命名空间需显式声明:例如
declare namespace aw="https://example.com/ns"; /aw:root/aw:item
FLWOR 表达式:处理复杂逻辑的关键结构
这是 XQuery 最具表现力的部分,名字来自五个关键词:
-
for:遍历节点序列,绑定变量(如
for $b in /books/book) -
let:定义中间变量,提升可读性(如
let $expensive := $b[price > 60]) -
where:添加布尔条件过滤(如
where $b/price > 50) -
order by:按值或表达式排序(如
order by $b/title ascending) -
return:生成结果,支持混合 XML 字面量与动态内容(用大括号
{}插入表达式)
示例:生成带序号的推荐书单
for $b at $pos in /books/book[price > 70]return
在 XML 数据库中实际运行 XQuery
主流环境都提供简洁入口,无需编码即可上手:
-
BaseX:下载后运行
bin/basexgui,拖入 XML 文件,直接在 Query 视图输入并执行 XQuery -
eXist-db:启动服务后访问
http://localhost:8080/exist/webapp/exist/apps/dashboard/index.html,上传文档,在 “Query” 标签页编写运行 -
SQL Server:对 xml 类型列使用
.query()方法,如SELECT XmlCol.query('/root/item') FROM MyTable - 命令行快速测试:BaseX 支持
basex -i data.xml query.xq批量执行脚本
常见误区与实用建议
初学者容易卡在几个细节上,注意避开:
- 根路径取决于数据库存储方式:eXist-db 中文档可能挂载在
/db/mycoll/book.xml,查询时写/book即可;BaseX 导入后默认文档名为doc,常需从/doc/books/book开始 - 字符串比较必须加引号:
author = "张三",不能写author = 张三 - 返回纯文本用
data($node)或$node/text(),否则可能带标签或空格 - 调试技巧:先用简单路径(如
/books/book[1])确认结构,再逐步加 where 和 return










