json:transform-from-json将\ u001e转换为并导致错误“无效的XML字符代码点30”如何处理?

问题描述 投票:1回答:2

我的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)
json xml xquery marklogic
2个回答
1
投票

字符x1e在XML中是非法的,即使表示为,也无法将其原样保留。我不知道您使用的转换器提供了什么,但是XPath 3.1中的json-to-xml()函数提供了几个选项:保留JSON转义序列\u001e(它没有XML定义的含义,但可能对应用程序处理文档),替换SUB字符或调用用户提供的后备功能。


1
投票

不需要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!

© www.soinside.com 2019 - 2024. All rights reserved.