используя xdmp:document-insert и указав кодировку xml

У меня есть конечная точка xquery, которая загружает файл, поступающий в базу данных, с помощью xdmp:document-insert.. и это не удается при попытке загрузить XML-документ с кодировкой «ISO-8859-1». Ниже приведен мой код

declare  %rapi:transaction-mode("update") function repoLoad:post($context as map:map, $params  as map:map,$input as document-node()*) as document-node()*
{

    let $filename := xdmp:get-request-field-filename("upload")
    let $contentType := xdmp:get-request-field-content-type("upload")

    let $uri := "/documents/"

    let $_ := xdmp:document-insert($uri, xdmp:get-request-field("upload"),(xdmp:default-permissions()), ("raw"))

    return $uri

};

Это не удается для XML-документов, которые не закодированы в кодировке UTF8. Я получаю следующее исключение. Любой обходной путь?

Ошибка: AppRequestTask::run: XDMP-DOCUTF8SEQ: недопустимая управляющая последовательность UTF-8 в строке 1 -- документ не закодирован в UTF-8


person Ravi    schedule 17.02.2016    source источник


Ответы (1)


Если вы можете сгенерировать полезную нагрузку с помощью пролога XML, который объявляет кодировку, это должно работать:

<?xml version="1.0" encoding="ISO-8859-1">
... rest of the document ...

В противном случае вы можете попробовать сделать на сервере что-то вроде следующего, чтобы сгенерировать XML-документ для вставки:

xdmp:document-insert(
    $uri,
    xdmp:binary-decode(
        xdmp:unquote(
            xdmp:get-request-field("upload"), (), "format-binary"
            ),
        "ISO-8859-1"
        ),
    ... collection, permissions, and other arguments ...
    )

Надеясь, что это поможет,

person ehennum    schedule 17.02.2016
comment
На самом деле XML-файл, который я загружаю, имеет XML-пролог ``` ‹?xml version=1.0 encoding=ISO-8859-1?›‹!DOCTYPE ClinicalTrial SYSTEM TrialTrove4_v2.1.dtd[]›‹ClinicalTrial id=5936› . .. ``` Второе решение мне не подойдет, так как я не могу предполагать, что все, что приходит, это XML, - person Ravi; 17.02.2016
comment
В первом решении вы уверены, что заявленная кодировка верна? Иногда файлы не объявляют правильную кодировку. Вы можете попробовать xdmp:unquote() с format-xml вместо format-binary и без xdmp:binary-decode(), чтобы увидеть, работает ли это. Что касается второго решения, я предполагаю, что вы можете перейти к $contentType, чтобы определить, когда применять этот подход. - person ehennum; 17.02.2016
comment
Насколько мне известно, MarkLogic всегда игнорировал кодировку объявления. При включенной опции восстановления он будет прослушивать первые несколько строк символов, чтобы сделать обоснованное предположение, но в остальном использует кодировку по умолчанию UTF-8. Ограниченную информацию можно найти здесь: docs.marklogic.com/xdmp:document-get . - person grtjn; 17.02.2016
comment
Несколько лет назад я написал несколько функций для интеллектуального прослушивания кодировки при приеме, но это немного замедляет прием: markmail.org /message/jiuf4zk5s3gyflic. Такие функции, как docs.marklogic.com/xdmp:encoding-language-detect, могут сделать это немного проще, не пробовал .. - person grtjn; 17.02.2016