json: transform-from- json преобразует \ u001e в и вызывает ошибку «Неверный XML символьная кодовая точка 30», как с этим справиться? - PullRequest
1 голос
/ 04 марта 2020

Моя строка JSON имеет экранированный юникод \u001e. Преобразование JSON в XML с помощью функции json:transform-from-json() преобразует \u001e в .

Выполнение xdmp:unquote поверх этих данных дает следующую ошибку:

Недопустимый XML кодовая точка 30 символов в строке 1 - документ содержит не 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)

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Нет необходимости xdmp:unquote результата. json:transform-from-json возвращает структуру XML, а не строковое представление. Передав его в xdmp:unquote, вы заставляете MarkLogi c атомизировать аргумент, в результате чего получается строка с недопустимым символом в виде простого символа, а не в виде цифры c.

xdmp:unquote не позволит MarkLogi c выдать ошибку на этом этапе, но вы все равно можете столкнуться с подобными проблемами в цепочке. MarkLogi c в настоящее время не поддерживает 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!

1 голос
/ 04 марта 2020

Символ x1e недопустим в XML, даже если он представлен как , поэтому его невозможно сохранить как таковой. Я не знаю, какой конвертер вы используете, но функция json-to-xml() в XPath 3.1 предлагает несколько вариантов: сохранение escape-последовательности JSON \u001e (которая не имеет XML -определенного значения, но может иметь смысл для приложения, обрабатывающего документ), заменяя символ SUB или вызывая предоставленную пользователем резервную функцию.

...