Подтвердить что ты не робот

Преобразование большого XML файла в реляционную базу данных

Я пытаюсь найти лучший способ выполнить следующее:

  • Загружайте большой XML файл (1 ГБ) ежедневно со стороннего веб-сайта.
  • Преобразование этого XML файла в реляционную базу данных на моем сервере
  • Добавить функциональность для поиска в базе данных

Для первой части это то, что нужно было бы сделать вручную или это можно было бы выполнить с помощью cron?

Большинство вопросов и ответов, связанных с XML и реляционными базами данных, относятся к Python или PHP. Можно ли это сделать с помощью javascript/nodejs?

Если этот вопрос лучше подходит для другого форума StackExchange, сообщите мне, и я перевешу его туда.

Ниже приведен пример кода xml:

<case-file>
  <serial-number>123456789</serial-number>
    <transaction-date>20150101</transaction-date>
      <case-file-header>
       <filing-date>20140101</filing-date>
      </case-file-header>
      <case-file-statements>
       <case-file-statement>
        <code>AQ123</code>
        <text>Case file statement text</text>
       </case-file-statement>
       <case-file-statement>
        <code>BC345</code>
        <text>Case file statement text</text>
       </case-file-statement>
     </case-file-statements>
   <classifications>
  <classification>
   <international-code-total-no>1</international-code-total-no>
   <primary-code>025</primary-code>
  </classification>
 </classifications>
</case-file>

Здесь представлена ​​еще одна информация о том, как эти файлы будут использоваться:

Все файлы XML будут в одном формате. В каждой записи есть, вероятно, несколько десятков элементов. Файлы обновляются третьей стороной на ежедневной основе (и доступны в виде заархивированных файлов на стороннем веб-сайте). Каждый день файл представляет новые файлы case, а также обновленные файлы case.

Цель состоит в том, чтобы позволить пользователю искать информацию и организовывать эти результаты поиска на странице (или в сгенерированном файле pdf/excel). Например, пользователь может захотеть просмотреть все файлы case, которые содержат определенное слово в элементе <text>. Или пользователь может захотеть просмотреть все файлы case, содержащие первичный код 025 (<primary-code> element) и которые были отправлены после определенной даты (элемент <filing-date>).

Единственные данные, введенные в базу данных, будут из файлов XML - пользователи не будут добавлять какую-либо свою собственную информацию в базу данных.

4b9b3361

Ответ 1

Все шаги могут быть выполнены с помощью node.js. Доступны модули, которые помогут вам в каждой из этих задач:

    • node-cron: позволяет легко настроить задачи cron в вашей программе node. Другой вариант - настроить задачу cron в вашей операционной системе (много ресурсов, доступных для вашей любимой ОС).
    • download: модуль для загрузки файлов с URL-адреса.
  • xml-stream: позволяет передавать файл и регистрировать события, которые срабатывают, когда парсер сталкивается с определенными элементами XML. Я успешно использовал этот модуль для анализа файлов KML (если они были значительно меньше ваших файлов).

  • node-postgres: node клиент для PostgreSQL (я уверен, что есть клиенты для многих других распространенных РСУБД, PG - единственный, который у меня есть используется до сих пор).

В большинстве этих модулей есть довольно интересные примеры, которые помогут вам начать работу. Вот как вы, вероятно, настроили часть потока XML:

var XmlStream = require('xml-stream');
var xml = fs.createReadStream('path/to/file/on/disk'); // or stream directly from your online source
var xmlStream = new XmlStream(xml);
xmlStream.on('endElement case-file', function(element) {
    // create and execute SQL query/queries here for this element
});
xmlStream.on('end', function() {
    // done reading elements
    // do further processing / query database, etc.
});

Ответ 2

Вы уверены, что вам нужно поместить данные в реляционную базу данных или просто хотите выполнить поиск в целом?

В данных нет никаких реальных отношений, поэтому было бы проще разместить его в индексе поиска документа, таком как ElasticSearch.

Любой автоматический конвертер XML в JSON, вероятно, создаст подходящий вывод. Большой размер файла является проблемой. Эта библиотека, несмотря на то, что она говорит, что "не потоковая передача", на самом деле потоковая передача, если вы проверяете исходный код, так что это сработает для вас.

Ответ 3

У меня была задача с xml файлами, как вы писали. Это принципы, которые я использовал:

  • Все входящие файлы, которые я хранил, как в DB (XMLTYPE), потому что мне нужна информация о исходном файле;
  • Все входящие файлы обрабатываются преобразованием XSL. Например, я вижу, что здесь три объекта: fileInfo, fileCases, fileClassification. Вы можете написать преобразование XSL для компиляции информации о исходном файле в 3 типа сущностей (в тегах FileInfo, FileCases, FileClassification);
  • Когда вы выведете преобразованный XML, вы можете сделать 3 процедуры, которые вставляют данные в БД (каждый объект в области БД).