尝试插入数组节点对象 XDMP-CHILDDUPNAME 时出错?

Error trying to insert array node object XDMP-CHILDDUPNAME?

提问人:supersteve 提问时间:11/6/2023 最后编辑:Mads Hansensupersteve 更新时间:11/6/2023 访问量:28

问:

我已经阅读了有关使用 XQuery 操作 JSON 文档以及使用 xdmp:insert-xxx 添加节点和向数组添加元素的所有文档,但我正在尝试创建一个具有现有数组值数组的新对象,但似乎无法弄清楚。

我想将以下对象添加到我的 json 文档的根节点。

{
 "A" : [ "B", "C" ]
}

当我尝试时,

xdmp:node-insert-child( $doc/object-node(), object-node{ "ConfiscatedItems" : array-node{ "calculator", "welding iron" } }/ConfiscatedItems )

我收到 XDMP-CHILDDUPNAME 对象节点不能有两个同名的子节点

我的最终目标是说,如果我有一份文件,比如;

{
   "f": "g",
   "h": 1,
   "q": [ 1, 2 ]
}

我希望它看起来像;

{
   "f": "g",
   "h": 1,
   "q": [ 1, 2 ],
   "A": [ "B", "C" ]
}

我可以通过创建一个名为“A”的新文本节点和与数组一起使用来分两步完成此操作,但我想在一个步骤中完成此操作,而不是两个步骤。这主要是因为我正在创建用于执行任务的通用代码,这意味着我对事务有限制,并且不能在同一事务中分两步执行此操作。 有人可以帮忙吗?xdmp:node-replace()xdmp:value()

xQuery 标记逻辑

评论


答:

1赞 Mads Hansen 11/6/2023 #1

当您的 XPath 使用数组节点对命名属性进行寻址时,它将返回数组项的序列。这些项目将具有相同的名称,并将导致(如果您不了解正在发生的事情,则会感到困惑)错误消息 XDMP-CHILDDUPNAME/ConfiscatedItems

使用 xdmp:describe() 更好地了解为 JSON 节点选择的内容会很有帮助。

您希望返回数组节点,而不是数组中的项。因此,请将您的 XPath 更改为:

/ConfiscatedItems

自:

/array-node("ConfiscatedItems")

或者,以匹配您发布的示例 JSON/array-node("A")

评论

0赞 supersteve 11/8/2023
谢谢。仔细想想就有点明显了。我没在想。