XML 个文件的 eXist-db / XQuery compression:zip() 仅保存文本
eXist-db / XQuery compression:zip() of XML files saves text only
在 eXist-db 4.4、XQuery 3.1 中,我使用自动化来压缩一些 xml 文件。问题是,当他们压缩时,他们只存储文本内容而不是 xml 内容。
此函数使用 compression:zip
从一批文档中创建一个 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>
per documentation:
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...]
}
我认为它缺少序列化配置,但我无法弄清楚...
在此先感谢您的帮助。
此处是对 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 中的序列化选项,请参阅我对先前问题的回答:。
在 eXist-db 4.4、XQuery 3.1 中,我使用自动化来压缩一些 xml 文件。问题是,当他们压缩时,他们只存储文本内容而不是 xml 内容。
此函数使用 compression:zip
从一批文档中创建一个 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>
per documentation:
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...]
}
我认为它缺少序列化配置,但我无法弄清楚...
在此先感谢您的帮助。
此处是对 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 中的序列化选项,请参阅我对先前问题的回答: