将大型XML文件转换为关系数据库

我试图找出完成以下的最佳方法:

  1. 从第三方网站每天下载一个大的XML(1GB)文件
  2. 将该XML文件转换为我的服务器上的关系数据库
  3. 添加function来search数据库

对于第一部分,这是需要手动完成的,还是可以用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文件将采用相同的格式。 每个logging中可能有几十个元素。 这些文件每天都由第三方进行更新(并在第三方网站上以压缩文件forms提供)。 每一天的文件代表新的病例文件以及更新的病例文件。

目标是允许用户search信息并在页面上(或生成的pdf / excel文件)组织这些search结果。 例如,用户可能希望查看在<text>元素中包含特定单词的所有案例文件。 或者用户可能想要查看包含主要代码025( <primary-code>元素)以及在特定date( <filing-date>元素)之后提交的所有案例文件。

input数据库的唯一数据将来自XML文件 – 用户不会将任何自己的信息添加到数据库中。

所有步骤当然可以使用node.js完成。 有可用的模块可以帮助你完成这些任务:

    • node-cron :可以让你在节点程序中轻松设置cron任务。 另一个select是在您的操作系统上设置一个cron任务(大量可用于您最喜爱的操作系统的资源)。
    • 下载 :模块轻松地从URL下载文件。
  1. xml-stream :允许您在parsing器遇到特定的XML元素时对文件进行stream式处理并注册事件。 我已经成功地使用这个模块来parsingKML文件(当然,它们比你的文件要小得多)。

  2. node-postgres :PostgreSQL的节点客户端(我确定有许多其他常见RDBMS的客户端,PG是迄今为止唯一使用的客户端)。

这些模块中的大部分都有很好的例子,可以帮助你入门。 以下是您可能设置XMLstream式传输部分的方法:

 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. }); 

你确定你需要把数据放在关系数据库中吗?或者你只是想一般地search它?

在数据中似乎没有任何实际关系 ,因此将它放在文档search索引(如ElasticSearch)中可能会更简单。

任何自动的XML到JSON转换器都可能产生合适的输出。 大文件大小是一个问题。 这个库 ,尽pipe它的总结说“不stream”,实际上是stream如果你检查源代码,所以它会为你工作。

我写了xml文件的任务。 这是我使用的校长:

  1. 所有传入的文件存储在DB(XMLTYPE)中,因为我需要一个源文件信息;
  2. 所有传入的文件都使用XSL转换进行parsing。 例如,我看到它是三个实体在这里:fileInfo,fileCases,fileClassification。 您可以编写XSL转换来编译3种实体types(标签FileInfo,FileCases,FileClassification)中的源文件信息;
  3. 当你有输出转换的XML,你可以做3个过程,将数据插入到DB(DB区域中的每个实体)。