将大型 XML 文件转换为关系数据库
Converting large XML file to relational database
我正在尝试找出实现以下目标的最佳方法:
- 每天从第三方网站下载一个大 XML (1GB) 文件
- 将 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 个文件将采用相同的格式。每条记录中可能有几十个元素。这些文件由第三方每天更新(可在第三方网站上以压缩文件的形式获得)。每天的文件代表新的案例文件以及更新的案例文件。
目标是允许用户搜索信息并在页面上(或在生成的 pdf/excel 文件中)组织这些搜索结果。例如,用户可能希望查看在 <text>
元素中包含特定单词的所有案例文件。或者,用户可能希望查看所有包含主要代码 025(<primary-code>
元素)和在特定日期(<filing-date>
元素)之后提交的案例文件。
输入数据库的唯一数据将来自 XML 文件——用户不会将他们自己的任何信息添加到数据库中。
使用node.js
当然可以完成所有步骤。有一些模块可以帮助您完成以下每项任务:
xml-stream:允许您流式传输文件并注册当解析器遇到某些 XML 元素时触发的事件。我已成功使用此模块解析 KML 文件(假设它们比您的文件小得多)。
node-postgres:PostgreSQL 的节点客户端(我相信还有许多其他常见 RDBMS 的客户端,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.
});
您确定要将数据放在关系型数据库中,还是只想进行一般搜索?
数据中似乎没有任何实际的关系,因此将其放入ElasticSearch等文档搜索索引中可能更简单。
任何自动 XML 到 JSON 转换器可能会产生合适的输出。大文件大小是一个问题。 This library,尽管它的摘要说 "not streaming",但如果您检查源代码,它实际上是流式传输,因此它对您有用。
我在你写的时候处理了 xml 个文件。这是我使用的原则:
- 我将所有传入文件按原样存储在数据库中 (XMLTYPE),因为我需要源文件信息;
- 所有传入的文件都使用 XSL 转换进行了分析。比如我看到这里是三个实体:fileInfo、fileCases、fileClassification。您可以编写 XSL 转换以编译 3 种实体类型(在标签 FileInfo、FileCases、FileClassification 中)的源文件信息;
- 当你转换输出后XML你可以做3个过程,将数据插入数据库(数据库区域中的每个实体)。
我正在尝试找出实现以下目标的最佳方法:
- 每天从第三方网站下载一个大 XML (1GB) 文件
- 将 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 个文件将采用相同的格式。每条记录中可能有几十个元素。这些文件由第三方每天更新(可在第三方网站上以压缩文件的形式获得)。每天的文件代表新的案例文件以及更新的案例文件。
目标是允许用户搜索信息并在页面上(或在生成的 pdf/excel 文件中)组织这些搜索结果。例如,用户可能希望查看在 <text>
元素中包含特定单词的所有案例文件。或者,用户可能希望查看所有包含主要代码 025(<primary-code>
元素)和在特定日期(<filing-date>
元素)之后提交的案例文件。
输入数据库的唯一数据将来自 XML 文件——用户不会将他们自己的任何信息添加到数据库中。
使用node.js
当然可以完成所有步骤。有一些模块可以帮助您完成以下每项任务:
xml-stream:允许您流式传输文件并注册当解析器遇到某些 XML 元素时触发的事件。我已成功使用此模块解析 KML 文件(假设它们比您的文件小得多)。
node-postgres:PostgreSQL 的节点客户端(我相信还有许多其他常见 RDBMS 的客户端,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.
});
您确定要将数据放在关系型数据库中,还是只想进行一般搜索?
数据中似乎没有任何实际的关系,因此将其放入ElasticSearch等文档搜索索引中可能更简单。
任何自动 XML 到 JSON 转换器可能会产生合适的输出。大文件大小是一个问题。 This library,尽管它的摘要说 "not streaming",但如果您检查源代码,它实际上是流式传输,因此它对您有用。
我在你写的时候处理了 xml 个文件。这是我使用的原则:
- 我将所有传入文件按原样存储在数据库中 (XMLTYPE),因为我需要源文件信息;
- 所有传入的文件都使用 XSL 转换进行了分析。比如我看到这里是三个实体:fileInfo、fileCases、fileClassification。您可以编写 XSL 转换以编译 3 种实体类型(在标签 FileInfo、FileCases、FileClassification 中)的源文件信息;
- 当你转换输出后XML你可以做3个过程,将数据插入数据库(数据库区域中的每个实体)。