Node.js 流,用于使用 xml 流进行 XML 转换



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

  1. 将收集的元素管道传输到流
  2. (可选)使用一个或多个管道转换这些元素
  3. 将结果通过管道传输到 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结果不会产生任何输出。

任务完成。 下面的函数返回可以通过管道传输到任何可写流的transform streamliner._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;
}

也许您应该检查库提供的示例。如果你已经这样做了,如果你指出这一点就好了。所以我使用应许之地进行数据流,并使用 Highlandjs 从数组创建一个流,它只有一个元素 - item

最后,你有流,你可以根据高地文档使用它。

    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 文件,则可能会更简单、更智能的解决方案。

我建议 node-modules.com 和 libraries.io/npm 来改进 NPM 搜索。

相关内容

  • 没有找到相关文章

最新更新