MarkLogic中json:transform-to-json转换<name>元素为null的问题
MarkLogic json:transform-to-json custom模式下元素转成null的问题解决
问题现象
使用MarkLogic的json:transform-to-json函数并配置custom模式时,XML中的<name>元素被转换为null,其他元素(如<a>)能正常保留文本内容。仅当元素名为<name>时触发该问题,修改为其他名称(如<names>)可正常转换,且同一MarkLogic实例中部分数据库无此异常。
测试代码:
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy"; let $myxml := <root><a>some text</a><name>some other text</name></root> let $jsonConfig := json:config("custom") return json:transform-to-json($myxml,$jsonConfig)
实际返回:
{"root": { "a": "some text", "name": null } }
预期返回:
{"root": { "a": "some text", "name": "some other text" }}
问题原因
MarkLogic的custom模式默认将<name>元素视为用于定义JSON对象键名的特殊元素,而非普通的文本承载元素。当<name>元素仅包含文本内容时,不符合特殊元素的解析逻辑,因此被转换为null。部分数据库无此问题,是因为这些数据库的全局JSON转换配置已修改了<name>元素的处理规则。
解决方案
方案1:在代码中修改JSON配置
通过调整json:config生成的配置对象,移除或重新定义<name>元素的特殊处理规则:
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy"; let $myxml := <root><a>some text</a><name>some other text</name></root> let $jsonConfig := json:config("custom") (: 移除name元素的特殊映射,使其作为普通元素处理 :) let $jsonConfig := map:remove($jsonConfig, "name") (: 或者明确指定name元素按文本规则转换 :) let $jsonConfig := map:put($jsonConfig, "name", json:element-rule("text")) return json:transform-to-json($myxml,$jsonConfig)
方案2:调整数据库全局JSON配置
登录MarkLogic管理界面,找到目标数据库的配置页,进入JSON选项模块,检查是否存在针对<name>元素的特殊转换规则,将其修改为普通文本元素的处理规则即可。
内容的提问来源于stack exchange,提问作者maifosz
相关产品推荐
相关产品推荐

