我正在使用 xml-stream读取大型 XML 文件。我想:
- 将收集到的元素通过管道传输到流中
- 可选地,使用一个或多个管道转换这些元素
- 将结果通过管道传递给 HTTP 响应
这是收集所需元素的 xml-stream
片段:
xml.on('endElement: item', function(item) {
// pipe item to stream
})
如何为第 1 步和第 2 步构建流?
附言xml-stream
只有console.log
例子
更新 1
这是我到目前为止写的:
stream = require('stream');
let liner = new stream.Transform( { objectMode: true } );
liner._transform = function (data, encoding, done) {
this.push(data);
console.log(data);
console.log('=======================');
done();
};
let fileStream = fs.createReadStream(fileNames[0]);
let xmlStream = new XmlStream(fileStream);
let counter = 0;
xmlStream.on('endElement: Item', function(el) {
liner.write(el);
counter += 1;
});
xmlStream.on('end', function() {
console.log(counter);
liner.end();
});
_transform
在每次 write
时都会被调用,但是将 liner
流传输到 http 结果不会产生任何输出。
最佳答案
任务完成。下面的函数返回可以通过管道传输到任何可写流的转换流
。 liner._flush
是必要的,只有你想在流的末尾添加一些数据。
附言一个方便的模块(此处未使用)https://github.com/rvagg/through2
const fs = require('fs');
const stream = require('stream');
const XmlStream = require('xml-stream');
function getTransformStream() {
let liner = new stream.Transform( { objectMode: true } );
liner._transform = function (data, encoding, done) {
// have your transforms here
this.push(data);
console.log(data);
console.log('=======================');
done();
};
liner._flush = function (done) {
console.log('DONE DONE DONE DONE');
done();
};
let fileStream = fs.createReadStream('filename');
let xmlStream = new XmlStream(fileStream);
let counter = 0;
xmlStream.on('endElement: Item', function(el) {
liner.write(JSON.stringify(el));
counter += 1;
});
xmlStream.on('end', function() {
console.log(counter);
liner.end();
});
return liner;
}
关于javascript - 使用 xml-stream 进行 XML 转换的 Node.js 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30911536/