如何判断XML解析器是否已完成解析文件?

时间:2018-09-24 20:05:57

标签: node.js xml parsing

我正在解析一个2GB以上的xml文件,最初我处理(多线程)记录是一个接一个。

但是对数据库的单次插入sql查询太慢了(DB瓶颈),因此我需要在通过xml文档后创建一个大量的插入查询/ cvs文件。但是与Java不同,在nodejs中,我无法确定文档是否已完全解析。

工作12个小时以上,如果有人可以帮助我,那将是很棒的。也许尝试其他xml库?或只使用良好的旧Java。

 var bigXml = require('big-xml');  
     reader = bigXml.createReader('dblp.xml', /^(article)$/, { gzip: false });

 var count = 0;
  var temp = [];
  reader.on('record', async function (record) {

  console.log("Processing article:" + count);

  count++;

   var pubBody = importPubBuilder(record); 
   temp.push(pubBody);
  //taking temp Array to csv when finish reading file

  });

  reader.on('error', function (err) {
    console.log(err);
  });

function importPubBuilder(record) {

  var body = {};
  body.pubkey = record.attrs.key;
  body.mdate = record.attrs.mdate;
  body.title = null;
  body.ee = null;
  body.url = null;

  if (record.children.find(obj => {    return obj.tag == "title"  }) != null)  {
    body.title = record.children.find(obj => {    return obj.tag == "title"  }).text;
  }

  if( record.children.find(obj => {    return obj.tag == "ee"  }) != null){
    body.ee =record.children.find(obj => {    return obj.tag == "ee"  }).text
  }
  if( record.children.find(obj => {    return obj.tag == "url"  }) !=null){
    body.url = record.children.find(obj => {    return obj.tag == "url"  }).text
  }

  return body

}

1 个答案:

答案 0 :(得分:0)

当文件流关闭时,更新添加了关闭事件发射器。在npm big-xml-notify link

上进行了改进的分叉