将XML加载到MongoDB中

有许多情况下您可能需要将数据从XML导出到MongoDB。

尽管在MongoDB中使用的XML和JSON(B)格式有很多共同之处,但它们也有一些不同之处,使它们无法互换。

因此,在面临将数据从XML导出到MongoDB的任务之前,您需要:

  1. 编写自己的XML解析脚本;
  2. 使用ETL工具。

尽管现代语言模型可以很好地用诸如Python等语言编写解析脚本,但这些脚本会存在一个严重问题 —— 它们不会统一。对于每种文件类型,现代语言模型将生成单独的脚本。如果您有多种类型的XML,这将在维护多个解析脚本时带来重大问题。

上述问题通常使用专门的ETL工具来解决。在本文中,我们将介绍一种名为SmartXML的ETL工具。虽然SmartXML也支持将XML转换为关系表示,但我们将只关注将XML上传到MongoDB的过程。

实际的XML可能非常庞大和复杂。本文是一篇入门文章,因此我们将解析一个情况,即:

  1. 所有XML具有相同的结构;
  2. XML的逻辑模型与MongoDB中的存储模型相同;
  3. 提取的字段不需要复杂的处理;

我们稍后会讨论这些情况,但首先让我们看看一个简单的例子:

XML

 

在这个例子中,我们只会在MongoDB中上传具有实际用途的字段,而不是整个XML。

创建新项目

建议通过GUI创建新项目。这将自动创建必要的文件夹结构和解析规则。项目结构的完整描述可以在官方文档中找到。

本文中描述的所有参数都可以在图形模式下进行配置,但为了清晰起见,我们将重点关注文本表示。

除了包含项目设置的config.txt文件和用于批处理的job.txt之外,项目本身还包括:

  1. 位于项目文件夹templates/data-templates.red中的中间内部SmartDOM视图模板。.
  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

 

我们将在config.txt文件中设置MongoDB连接设置(参见nosql-url):

Plain Text

 

请记住,如果数据库和集合不存在,MongoDB会自动创建同名的数据库和集合。然而,这种行为可能会导致错误,建议默认禁用它。

让我们运行服务本身:

Python

 

接下来点击解析然后发送JSON到NoSQL。


现在以任何方便的方式连接到MongoDB控制台,并执行以下命令:

Plain Text

 

结果应该如下所示:

JSON

 

结论

在这个例子中,我们看到了如何在不编写任何代码的情况下自动将XML文件上传到MongoDB。 虽然这个例子只考虑了一个文件,但在一个项目的框架内,可以处理大量不同结构的文件类型和子类型,并执行相当复杂的操作,比如类型转换以及使用外部服务实时处理字段值。 这不仅允许从XML中卸载数据,还可以通过外部API处理一些值,包括使用大型语言模型。

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