我必须通过组合和处理大约100MB的多个xmls来生成单个xml文件。我无法找到任何可以流写入xml的node.js库。
我在库下面试过
所有这些库都将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数据写入文件的库。
谢谢,
答案 0 :(得分:1)
xmbuilder2 的 callback 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的某些部分(例如,用于移动和更改已生成的节点的功能)无法在此回调模式下工作,因为它们未缓存在内存中。