javascript - 使用 xml-stream 进行 XML 转换的 Node.js 流

标签 javascript node.js stream

我正在使用 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 结果不会产生任何输出。

最佳答案

任务完成。下面的函数返回可以通过管道传输到任何可写流的转换流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/

相关文章:

javascript - 检查字符串是否以小写字母开头

javascript - 如何在开关警报中添加总小数值

javascript - 我的脚本有错误吗?

javascript - 基于重复键过滤对象数组

c++ - 如何轻松地将输出缩进到 ofstream?

JavaScript 密码生成器有时不包括字符选择?

mysql - 从 Google AppEngine Standard 连接到 Google Cloud SQL 实例时出错(使用 NodeJS)

node.js - 如何在应用程序或功能模块加载时显式执行某些代码?

c++ - 使用三元运算符写入流?在 C++ 中

node.js - Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?