使用xmlstream进行XML转换的Node.jsstream

我正在使用XMLstream来读取一个大的XML文件。 我想:

  1. pipe道收集元素到一个stream
  2. 可选地,使用一个或多个pipe道来转换这些元素
  3. 将结果传递给一个http响应

这里是xml-stream片段收集所需的元素:

 xml.on('endElement: item', function(item) { // pipe item to stream }) 

如何为步骤1和步骤2构buildstream?

PS的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 _transform被调用,但是对于http结果的pipe道_transform不会产生任何输出。

任务完成。 下面的函数返回可以传送到任何可写入stream的transform streamstream。 liner._flush是必要的,只需要在stream的末尾添加一些数据。

PS一个方便的模块(这里不使用) 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; } 

也许你应该检查图书馆提供的例子。 如果你已经这样做了,如果你指出的话,这将是很好的。 因此,我使用Promised land进行数据stream动,并使用Highlandjs从数组中创build一个只有一个元素的数据stream。

最后,你有stream,你可以使用根据高地文件。

  var Land = require('promised-land') var stream = fs.createReadStream(path.join(__dirname, 'file.xml')); var xml = new XmlStream(stream); xml.preserve('item', true); xml.collect('subitem'); var arr = [] xml.on('endElement: item', function(item) { arr.push(item) }); xml.on('end', function(data) { var highlandStream = _(data) Land.emit('endStream', highlandStream) }); Land.promise('endStream').then(function(stream) { // now you can pipe your stream }) 

不过,如果您使用一些替代的Node.js库来读取XML文件,则可能会更简单更智能的解决scheme。

我推荐node-modules.com和libraries.io/npm来改进NPMsearch。