Node.js中的XML流编写器库

时间:2018-03-02 18:57:08

标签: javascript node.js xml

我必须通过组合和处理大约100MB的多个xmls来生成单个xml文件。我无法找到任何可以流写入xml的node.js库。

我在库下面试过

  1. xml-writer
  2. xmlbuilder
  3. GENX
  4. 所有这些库都将xml存储在内存中,这会导致内存不足。

    对于没有在内存中存储完整对象的相应库,您有什么建议。

    其中一个库(xml-writer)的示例代码

    var fs = require('fs');
    var XMLWriter = require('xml-writer');
    
    var writeStream = fs.createWriteStream("myfile",{
        encoding: 'utf-8'
     });
    
    var xw = new XMLWriter(false);
    xw.startDocument('1.0', 'UTF-8').startElement(function() {
        return 'root';
    });
    for(var i = 0 ; i < 10000000; i++ ) {
        xw.startElement(function() {
            return 'root1';
        }).text(function() {
            return 'Some content1';
        });
        xw.endElement();
    }
    xw.endElement();
    writeStream.write(xw.toString());
    writeStream.end();
    

    这是在文件中添加两个元素的简单代码。但它给了我内存异常。因为它正在创建一个对象,然后将完整的对象存储在内存中并立即将其写入文件中。

    我在google上搜索了很多但是找不到任何将xml数据写入文件的库。

    谢谢,

2 个答案:

答案 0 :(得分:1)

xmbuilder2callback API 略有不同:

const fs = require('fs');
const { createCB } = require('xmlbuilder2');

const ws = fs.createWriteStream('test.xml', {
  encoding: 'utf-8',
});

const xml = createCB({
  data: (text) => {
    ws.write(text);
  },
  prettyPrint: true,
});
xml.on('end', ws.close)

xml.dec().ele('root');

for (let i = 0; i < 1000000; i++) {
  xml.ele(`root${i}`).txt('Some content1').up();
}

xml
  .up()
  .end();

答案 1 :(得分:0)

xmlbuilder can do this使用“回调” API。您只需要在回调函数中写入流即可。

例如:

const xmlbuilder = require('xmlbuilder');

const xml = xmlbuilder.begin(function(chunk) { process.stdout.write(chunk); });
xml
  .dec()
  .ele('root')
;

for (let i = 0; i < 10; i++) {
  xml.ele('example' + i).up();
}

xml
  .up()  // close <root/>
  .end()
;

API的某些部分(例如,用于移动和更改已生成的节点的功能)无法在此回调模式下工作,因为它们未缓存在内存中。