将大型XML文件转换为关系数据库
问题内容:
我正在尝试找出实现以下目标的最佳方法:
- 每天从第三方网站下载大型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.
});