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

时间:2015-11-13 23:00:37

标签: javascript python xml node.js relational-database

我正在试图找出实现以下目标的最佳方法:

  1. 每天从第三方网站下载大型XML(1GB)文件
  2. 将该XML文件转换为我服务器上的关系数据库
  3. 添加搜索数据库的功能
  4. 对于第一部分,这是需要手动完成的事情,还是可以用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文件 - 用户不会将任何自己的信息添加到数据库中。

3 个答案:

答案 0 :(得分:7)

使用node.js肯定可以完成所有步骤。有些模块可以帮助您完成以下每项任务:

    • node-cron:让您可以在节点程序中轻松设置cron任务。另一个选择是在您的操作系统上设置一个cron任务(为您喜欢的操作系统提供大量资源)。
    • download:模块可以轻松地从网址下载文件。
  1. xml-stream:允许您流式传输文件并注册解析器遇到某些XML元素时触发的事件。我已成功使用此模块解析KML文件(授予它们的文件明显小于您的文件)。

  2. node-postgres:PostgreSQL的节点客户端(我确信有许多其他常见RDBMS的客户端,PG是我目前使用的唯一一个)。

  3. 这些模块中的大多数都有很好的例子可以让你入门。以下是您可能设置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.
    });
    

答案 1 :(得分:6)

您确定需要将数据放在关系数据库中,还是只想搜索它?

数据中似乎没有任何实际的关系,因此将其放入文档搜索索引(例如ElasticSearch)可能更为简单。

任何自动XML到JSON转换器都可能产生合适的输出。大文件大小是个问题。 This library,尽管其摘要说“不流式传输”,但如果您检查源代码,实际上是流式传输,因此它适用于您。

答案 2 :(得分:2)

我写了一些关于xml文件的任务。这是我使用的原则:

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