json - JSONiq 和 XQuery 3.1 之间有什么区别?

标签 json xml xquery jsoniq

JSONiqXQuery 3.1 都扩展了 XQuery 3.0 以支持 JSON。

它们有什么区别?

最佳答案

整体动机

XQuery 3.1 旨在支持内存中的其他数据结构(映射、数组)。这些结构被映射到 JSON 用于输入和输出。自 2017 年 3 月以来,XQuery 3.1 一直是 W3C 推荐标准。

JSONiq 的设计目标是在文档存储等设置中查询和更新 JSON。它也是由 XML 查询工作组的成员(免责声明:我是其中之一)在研究支持 JSON 的各种可能性时设计的。虽然它不是官方推荐,但它是稳定且公开的。

数据模型

XQuery 3.1 和 JSONiq 都使用对象和数组扩展了数据模型,但出于不同的侧重点,它们以不同的方式进行扩展。总体而言,XQuery 3.1 具有更通用的数据模型,而 JSONiq 将其限制为镜像 JSON。

在 JSONiq 中,对象键必须是字符串。在 XQuery 3.1 中,它们可以是任何原子值。

在 JSONiq 中,对象和数组中的值必须是单项,特别是数组与序列同态,即使它们是不同的。在 XQuery 3.1 中,对象和数组中的值可以是项目序列。

在 JSONiq 中,空值用专用的原子类型表示。在 XQuery 3.1 中,它们用空序列表示(这是数据模型中可接受的值)。

在 XQuery 3.1 中,不通过填充数组或映射来复制值,这支持在 XML 节点上构建索引等。在 JSONiq 中,复制类似于 XML 构造函数,以确保严格的树语义。

build

在 JSONiq 中构造对象和数组的语法是 JSON 的超集。

{ "foo" : [ 1 to 10 ] }

在 XQuery 3.1 中,它类似于计算的 XML 节点构造函数:

map { "foo" : array { 1 to 10 } }

XQuery 3.1 有另一种数组语法,其中逗号分隔值的槽,以嵌套序列:

[ 1, (1 to 10), 11 ]

导航

XQuery 3.1 使用函数调用在对象和数组中执行查找:

let $map := map { "foo" : "bar" }
return $map("foo")

let $array := array { 1, 2, 3 }
return $array(2)

它还使用 ? 作为不带引号的名称和整数的快捷方式:

let $map := map { "foo" : "bar" }
return $map?foo

let $array := array { 1, 2, 3 }
return $array?2

let $array := array { 1, 2, 3 }
return $array?*

JSONiq(核心语言)使用点和方括号

let $map := { "foo" : "bar" }
return $map.foo

let $array := [ 1, 2, 3 ]
return $array[[2]]

let $array := [ 1, 2, 3 ]
return $array[]

(JSONiq 也作为 XQuery 的扩展存在,它也重载了函数调用语法)。

关于json - JSONiq 和 XQuery 3.1 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44919443/

相关文章:

android - DataBinding Binder 不适用于具有不同限定符的 2 个相同布局

java - eXist-db 从同一集合的许多 XML 中获取数据

java - 如何在 JAVA 中(以 XQJ 或任何其他方式)使用 Xquery 3.1(新功能,如映射和数组)?

javascript - 在 AngularJS 中更新 JSON 文件

javascript - 无法附加以 JSON 形式返回的内容

json - 如何使用 json 模式相互排除两个(或更多) bool 标志?

XML命名空间,无法选择节点

python - 如何将 JSON 文件读入 Dataframe?

java - OAI Jaxen XPath 问题

XQuery - 如何获取给定日期之前的 90 天?