將 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