XML внутри XML, как использовать в Base X

У меня есть проект, который должен анализировать XML-документы с помощью программного обеспечения Base X.

Моя проблема в том, что мой файл XML похож на модель:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v45-2014-04-03.dtd" [ ]>
...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v45-2014-04-03.dtd" [ ]>
...
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v45-2014-04-03.dtd" [ ]>
...

другими словами, внутри этого одного XML много XML, и когда я пытаюсь открыть его с помощью Base X, я получаю сообщение об ошибке:

O destino da instrução de processamento correspondente "[xX][mM][lL]" não é permitido., примерно в переводе на английский это выше

The instruction destiny of processing "[xX][mM][lL]" isn't allowed.

как?


person alvarosps    schedule 23.03.2016    source источник
comment
Вам придется нелегко, так как это не правильно сформированный XML-документ. Возможно, вы сможете разделить их, используя функции чтения в file: модуле, за которыми следует fn:parse-xml. Но если кто-то пообещал вам XML-ввод, скажите ему, чтобы он прислал вам правильный, правильно сформированный XML, так как это не так, и работа с ним будет утомительной, громоздкой и подверженной ошибкам.   -  person Jens Erat    schedule 23.03.2016
comment
Да, я знаю, что это будет утомительно.. но у меня как бы нет выбора.. это набор XML-файлов, которые диспонибилизированы только таким образом, это как на каждый день недели, есть XML, и когда неделя заканчивается, они объединяют все это в 1 и отключают его для загрузки ... Думаю, я попробую метод синтаксического анализа для нескольких файлов XML в буфере и использую его для отдельных файлов ... как вы сказали, утомительно; ~   -  person alvarosps    schedule 24.03.2016


Ответы (1)


Если у вас есть простые фрагменты XML без объявлений документов, вы также можете использовать fn:parse-xml-fragment("..."); но в вашем случае это не сработает.

Следующий XQuery поможет вам разделить содержимое входного файла и сохранить его в базе данных BaseX. Это должно работать из коробки, если ваш ввод не слишком велик, и если все новые документы начинаются с объявления документа (<?xml...); в противном случае вам придется немного изменить его:

let $lines := unparsed-text-lines('your-input.txt')
let $docs :=
  for tumbling window $doc-lines in $lines
  start $start when true()
  end next $next when starts-with($next, '<?xml')
  return parse-xml(string-join($doc-lines, '&#xa;'))
count $count
let $names :=
  for $doc at $pos in $docs
  return 'doc' || $pos || '.xml'
return db:create('your-database', $docs, $names)
person Christian Grün    schedule 24.03.2016