Сжатие eXist-db / XQuery: zip () файлов XML сохраняет только текст - PullRequest
0 голосов
/ 13 января 2019

В eXist-db 4.4, XQuery 3.1 я использую автоматизацию для сжатия ряда XML-файлов. Проблема в том, что когда они сжимают, они хранят только текстовое содержимое, а не XML-содержимое.

Эта функция использует compression:zip для создания почтового индекса из пакета документов:

declare option exist:serialize "expand-xincludes=no";
declare option exist:serialize "method=xml media-type=application/xml";
declare function zip:create-zip-by-batch()
{
    [...]

    let $zipobject := compression:zip(zip:get-entry-for-zip($x,false())

    let $zipname := "foozipname.zip"

    let $store := xmldb:store("/db/foodirectory", $zipname, $zipobject)

    return $store
};

Вышеуказанная функция вызывает эту функцию, когда документы сериализуются и помещаются в <entry> за документацию :

declare option exist:serialize "expand-xincludes=no";
declare option exist:serialize "method=xml media-type=application/xml";
declare function zip:get-entry-for-zip($x) 
{

 [...for each $foo document in $x, create an <entry>...]

 let $serialized := serialize($foo, map { "method": "xml" })
 let $entry =
          <entry name="somefooname" type='xml' method='store'>
               {$serialized}
          </entry>

 [...return a sequence of $entry...]
 }

Я думаю, что отсутствует конфигурация для сериализации, но я не могу понять ...

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 15 января 2019

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

xquery version "3.1";

(: create a test collection with 10 test files: 1.xml = <x>1</x> 
   thru 10.xml = <x>10</x> :)
let $prepare := xmldb:create-collection("/db", "test")
let $populate := (1 to 10) ! xmldb:store("/db/test", . || ".xml", <x>{.}</x>)

(: construct zip-bound <entry> elements for the documents in the test collection :)
let $entries := collection("/db/test") ! 
    <entry name="{util:document-name(.)}" type="xml" method="store">{
        serialize(., map { "method": "xml" })
    }</entry>

(: compress the entries and store in database :)
let $zip := compression:zip($entries, false())
return
    xmldb:store("/db", "test.zip", $zip)

Полученный ZIP-файл содержит 10 неповрежденных тестовых XML-документов. Вариант, показывающий, как записать ZIP-файл в папку в вашей файловой системе, см. https://gist.github.com/joewiz/aa8d84500b1f1478779cdf2cc1934348.

Более полное обсуждение вариантов сериализации в eXist см. В моем ответе на предыдущий вопрос: https://stackoverflow.com/a/49290616/659732.

...