Запрос генерирует ошибку 'XDMP-CHILDNODEKIND: $ final - узлы элемента не могут иметь дочерние элементы двоичного узла' - PullRequest
2 голосов
/ 16 мая 2019

Ниже приведен мой простой запрос, который считывает все файлы из каталога и хранит все файлы в переменной $ final. Сохранение переменной в одном файле.

Но при выполнении этого запроса через некоторое время он выдает [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 маленьких файлов в локальной системе, и я хочу объединить в один файл.

1 Ответ

2 голосов
/ 16 мая 2019

Каталог, вероятно, содержит двоичные документы (например, 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
...