Ниже приведен мой простой запрос, который считывает все файлы из каталога и сохраняет все файлы в $final Variable в одном файле.
Но при запуске этого запроса через некоторое время появляется ошибка [1.0-ml] XDMP-CHILDNODEKIND: $final -- узлы элементов не могут иметь дочерних двоичных узлов.
let $input-dir :=xdmp:filesystem-directory("d:\work\may\06-05-2019\all-
feeds-input-output\clc\log\clc-true-ouput\")/dir:entry
let $final :=
for $each at $i in $input-dir
return
xdmp:document-get($each/dir:pathname/text(),
<options xmlns = "xdmp:document-get">
<repair>full</repair>
<encoding>UTF-8</encoding>
</options>)
return
xdmp:save("D:\WORK\MAY\06-05-2019\ALL-FEEDS-INPUT-OUTPUT\CLC\LOG\COMBINE-XMLs\Combine-CLC-TRUE-INPUT.xml",
document{<records>{$final}</records>})
На самом деле, у меня есть 10000 небольших файлов в локальной системе, и я хочу объединить их в один файл.
Каталог, вероятно, содержит двоичные документы (например, PDF, изображения и т. д.). Когда вы прочитаете эти документы с помощью xdmp:document-get()
, вы получите узел binary()
.
Как указано в сообщении об ошибке, узлы binary()
не могут быть дочерними элементами XML-элемента.
Ваша переменная $final
будет последовательностью документов, и хотя бы один из них является узлом binary()
.
Вы можете исключить эти binary()
узлы. Например, добавив фильтр предиката к результатам xdmp:document-get()
:
let $final :=
for $each at $i in $input-dir
return
xdmp:document-get($each/dir:pathname/text(),
<options xmlns = "xdmp:document-get">
<repair>full</repair>
<encoding>UTF-8</encoding>
</options>
)[not(. instance of binary())]
или вы можете кодировка base64 двоичные данные, чтобы их можно было добавить в XML:
let $final :=
for $each at $i in $input-dir
let $doc :=
xdmp:document-get($each/dir:pathname/text(),
<options xmlns = "xdmp:document-get">
<repair>full</repair>
<encoding>UTF-8</encoding>
</options>)
return
if ($doc instance of binary())
then xdmp:base64-encode($doc)
else $doc
Большое спасибо, @Mads, теперь это работает