我的JSON字符串具有转义的Unicode \u001e
。使用函数json:transform-from-json()
将JSON转换为XML会将\u001e
转换为
。
在此数据之上执行xdmp:unquote
会出现以下错误:
第1行的无效XML字符代码点30-文档包含非XML字符**
是否有一种方法可以在使用\u001e
的JSON到XML的转换中保留json:transform-from-json()
这样的样式?
下面是我的代码段
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
let $json1 := ' { "name":"John", "age":30, "text":"john\u001e" }'
let $basic := json:config("basic")
let $basicXml := json:transform-from-json($json1, $basic)
return xdmp:unquote($basicXml)
字符x1e
在XML中是非法的,即使表示为
,也无法将其原样保留。我不知道您使用的转换器提供了什么,但是XPath 3.1中的json-to-xml()
函数提供了几个选项:保留JSON转义序列\u001e
(它没有XML定义的含义,但可能对应用程序处理文档),替换SUB
字符或调用用户提供的后备功能。
不需要xdmp:unquote
结果。 json:transform-from-json
返回XML结构,而不是字符串表示形式。通过将其传递给xdmp:unquote
,您可以强制MarkLogic雾化该参数,从而导致字符串中的非法字符为纯字符,而不是数字引用。
放弃xdmp:unquote
可以防止MarkLogic在该阶段引发错误,但是您可能仍然会遇到类似的问题。 MarkLogic当前不支持XPath 3.1,但是您可以在将JSON字符串传递到transform函数之前对其进行操作。也许不是最漂亮的,但这会起作用:
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
let $json1 := ' { "name":"John", "age":30, "text":"john\u001e" }'
let $json1 := replace($json1, '(\\u[0-9a-fA-F]{4})', '\\$1')
let $basic := json:config("basic")
let $basicXml := json:transform-from-json($json1, $basic)
return $basicXml
HTH!