【问题标题】:json:transform-from-json converts \u001e to  and causing the error "Invalid XML character codepoint 30" how to handle this?json:transform-from-json 将 \u001e 转换为并导致错误“Invalid XML character codepoint 30”如何处理?
【发布时间】:2020-03-04 16:35:56
【问题描述】:

我的 JSON 字符串具有转义的 unicode \u001e。使用函数 json:transform-from-json() 将 JSON 转换为 XML 会将 \u001e 转换为 

在此数据之上执行xdmp:unquote 会出现以下错误:

第 1 行的 XML 字符代码点 30 无效 -- 文档包含非 XML 字符**

有没有办法在使用json:transform-from-json() 的 JSON 到 XML 转换期间保留 \u001e

下面是我的代码sn-p

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      结果不需要xdmp:unquotejson:transform-from-json 返回 XML 结构,而不是字符串表示。通过将其传递给 xdmp:unquote,您可以强制 MarkLogic 将参数原子化,从而生成一个带有非法字符的字符串作为纯字符,而不是作为数字引用。

      不使用xdmp:unquote 将防止MarkLogic 在该阶段引发错误,但您可能仍会遇到类似的问题。 MarkLogic 目前不支持 XPath 3.1,但您可以在将 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 $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!

      【讨论】:

      • 在 json 到 xml 转换对我有用之前的字符串替换。感谢您的帮助。
      • 嗨,我想在 json 中将 \\u001e 转义为 \u001e。但是像换行符这样的其他字符应该保持转义。怎么做? TIA
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多