簡體   English   中英

Node.js使用xml-stream進行XML轉換

[英]Node.js streams for XML transformations with xml-stream

我正在使用xml-stream來讀取大型XML文件。 我想:

  1. 將收集的元素管道傳輸到流中
  2. 可選地,使用一個或多個管道來轉換這些元素
  3. 將結果傳遞給http響應

以下是收集所需元素的xml-stream片段:

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

如何為第1步和第2步構建流?

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();
});

每次write都會調用_transform ,但是到http結果的管道liner流不會產生任何輸出。

任務完成。 下面的函數返回transform stream ,可以通過管道輸送到任何寫流。 只有你想在流的末尾添加一些數據才需要liner._flush

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;
}

也許您應該查看該庫提供的示例。 如果你已經這樣做了,如果你已經指出了它會很好。 所以我使用的數據流量和Highlandjs應許之地,以創建陣列流,它只有一個元素-該item

最后,您有流,您可以根據Highland docs使用。

    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搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM