Загрузка XML в MongoDB

Существует множество ситуаций, когда вам может потребоваться экспортировать данные из XML в MongoDB.

Несмотря на то, что форматы XML и JSON(B), используемые в MongoDB, имеют много общего, у них также есть ряд различий, делающих их необменяемыми.

Поэтому прежде чем столкнуться с задачей экспорта данных из XML в MongoDB, вам потребуется:

  1. Написать собственные сценарии обработки XML;
  2. Использовать инструменты ETL.

Хотя современные языковые модели могут достаточно хорошо писать сценарии обработки на языках типа Python, у этих сценариев будет серьезная проблема — они не будут унифицированными. Для каждого типа файла современные языковые модели будут генерировать отдельный сценарий. Если у вас есть более одного типа XML, это уже создает значительные проблемы в поддержке более чем одного сценария обработки.

Вышеуказанная проблема обычно решается с использованием специализированных инструментов ETL. В этой статье мы рассмотрим инструмент ETL под названием SmartXML. Хотя SmartXML также поддерживает преобразование XML в реляционное представление, мы рассмотрим только процесс загрузки XML в MongoDB.  

Фактический XML может быть крайне большим и сложным. Эта статья является вводной, поэтому мы рассмотрим ситуацию, в которой:

  1. Все XML имеют одинаковую структуру;
  2. Логическая модель XML такая же, как и модель хранения в MongoDB;
  3. Извлеченные поля не требуют сложной обработки;

Мы рассмотрим эти случаи позже, но сначала давайте рассмотрим простой пример:

XML

 

В этом примере мы загрузим в MongoDB только те поля, которые имеют практическое значение, а не весь XML.

Создание нового проекта

Рекомендуется создать новый проект через графический интерфейс. Это автоматически создаст необходимую структуру папок и правила разбора. Полное описание структуры проекта можно найти в официальной документации.

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

Кроме файла config.txt с настройками проекта, job.txt для пакетной работы, сам проект состоит из:

  1. Шаблона промежуточного внутреннего SmartDOM представления, находящегося в папке проекта templates/data-templates.red.
  2. Правил обработки и преобразования самого SmartDOM, находящихся в папке rules.

Рассмотрим структуру data-templates.red:

Plain Text

 

Примечание

  1. Имя sample – это название категории, и это не имеет значения.
  2. Имя marketing_data – это название подкатегории. Нам нужно как минимум одно кодовое подкатегория (подтип).
  3. Промежуточные имена представлений не требуют точного соответствия именам тегов XML. В этом примере мы намеренно использовали стиль snake_case.

Извлечение Правил

Правила находятся в каталоге rules в папке проекта.

При работе с MongoDB нас будут интересовать только два правила:

  1. tags-matching-rules.red — устанавливает соответствие между деревом тегов XML и SmartDOM
  2. grow-rules.red — описывает связь между узлами SmartDOM и реальными узлами XML
Plain Text

 

Ключом будет имя узла в SmartDOM; значением будет массив, содержащий варианты написания узла из реального файла XML. В нашем примере эти имена совпадают.

Игнорируемые Теги

Чтобы избежать загрузки ненужных данных в MongoDB в приведенном выше примере, мы создаем файлы в папке ignores — по одному на каждый раздел, названные по названию каждого раздела. В этих файлах содержатся списки тегов, которые нужно пропустить при извлечении. В нашем примере у нас будет файл sample.txt, содержащий:

Plain Text

 

В результате, после анализа морфологии, промежуточное представление будет иметь следующий вид:

Plain Text

 

Обратите внимание, что после морфологического анализа будет показано только минимальное представление, содержащее данные из первых найденных узлов.

Вот JSON-файл, который будет сгенерирован:

JSON

 

Настройка Подключения к MongoDB

Поскольку MongoDB не поддерживает прямую вставку данных HTTP, потребуется промежуточный сервис.

Давайте установим зависимости: pip install flask pymongo.

Сам сервис:

Python

 

Мы установим параметры подключения к MongoDB в файле config.txt (см. nosql-url):

Plain Text

 

Помните, что MongoDB автоматически создаст базу данных и коллекцию с таким же именем, если они не существуют. Однако это поведение может вызвать ошибки, и рекомендуется отключить его по умолчанию.

Давайте запустим сам сервис:

Python

 

Далеенажмите Parseзатем Send JSON to NoSQL.


Теперь подключитесь к консоли MongoDB любым удобным способом и выполните следующие команды:

Plain Text

 

Результат должен выглядеть следующим образом:

JSON

 

Заключение

В этом примере мы увидели, как можно автоматизировать загрузку XML файлов в MongoDB, не написав ни строчки кода. Хотя пример рассматривает только один файл, в рамках одного проекта возможно работать с огромным количеством типов и подтипов файлов с различными структурами, а также выполнять довольно сложные манипуляции, такие как преобразование типов и использование внешних сервисов для обработки значений полей в реальном времени. Это позволяет не только выгружать данные из XML, но и обрабатывать некоторые значения через внешние API, включая использование больших языковых моделей.

Source:
https://dzone.com/articles/loading-xml-into-mongodb