Node.js 如何从节点中的两个文件创建单个读取流?

Node.js 如何从节点中的两个文件创建单个读取流?,node.js,fs,sax,node-streams,Node.js,Fs,Sax,Node Streams,我对NodeJS流和文件流非常陌生。我正在尝试使用SAX解析两个XML文件。我已成功地将其用于单个文件: const fs = require('fs'); const sax = require("sax"); const saxStream = sax.createStream(IS_STRICT, OPTIONS); saxStream.on("error", function (e) { ... }); ... const out = fs.createReadStream(INFIL

我对NodeJS流和文件流非常陌生。我正在尝试使用SAX解析两个XML文件。我已成功地将其用于单个文件:

const fs = require('fs');
const sax = require("sax");

const saxStream = sax.createStream(IS_STRICT, OPTIONS);
saxStream.on("error", function (e) { ... });
...
const out = fs.createReadStream(INFILE).pipe(saxStream);
如何将两个文件导入SAX


更新 我试图将SAX的输出放在一个文件中。下面是我使用的SAX,它是一个使用流的XML解析器:

好吧,我试着编写一种方法来实现这一点,但是SAX解析器只接受XML输入中的一个根节点,所以一旦处理完第一个文件,它就会忽略您提供给它的第二个XML中的所有XML,因为它在根节点之外

因此,如果要解析第二个文件,似乎需要创建第二个
sax.createStream()
,并将第二个文件提供给它。和往常一样,如果您向我们展示了您实际尝试如何处理解析的XML输入,我们可以为您提供一个更完整的建议

仅供参考,以下是我尝试过的:

const fs = require('fs');
const sax = require("sax");

const saxStream = sax.createStream(false, {trim: true, normalize: true});

saxStream.on("error", e => { 
    console.log("saxStream error", e);
});

saxStream.on("opentag", node => {
    console.log(node);
});

saxStream.on("end", () => {
    console.log("done with saxStream");
})


let stream1 = fs.createReadStream("./sample1.xml");
stream1.pipe(saxStream, {end: false});
stream1.on("end", () => {
    console.log("starting stream2")
    fs.createReadStream("./sample2.xml").pipe(saxStream, {end: true});
});
我在调试器中遍历了解析器,第二个文件的输入成功地输入到SAX解析器中,它只是忽略了它,因为它位于根节点之外

它可以在几个地方检查parser.closedRoot,如果是,它会跳过内容


事实上,我确实通过添加一个伪根标记来实现它,该标记可以包含两组XML。我不知道这是否是您想要的,但您可以出于教育目的对此进行检查:

const fs = require('fs');
const sax = require("sax");

const saxStream = sax.createStream(false, {trim: true, normalize: true});

saxStream.on("error", e => { 
    console.log("saxStream error", e);
});

saxStream.on("opentag", node => {
    console.log(node);
});

saxStream.on("end", () => {
    console.log("done with saxStream");
})


let stream1 = fs.createReadStream("./sample1.xml");
let stream2 = fs.createReadStream("./sample2.xml");
saxStream.write("<fakeTop>");
stream1.pipe(saxStream, {end: false});
stream1.on("end", () => {
    console.log("starting stream2")
    stream2.pipe(saxStream, {end: false});
    stream2.on("end", () => {
        saxStream.write("</fakeTop>");
        saxStream.end();
    });
});
const fs=require('fs');
const sax=需要(“sax”);
const saxStream=sax.createStream(false,{trim:true,normalize:true});
saxStream.on(“错误”,e=>{
log(“saxStream错误”,e);
});
saxStream.on(“opentag”,node=>{
console.log(节点);
});
saxStream.on(“结束”,()=>{
log(“使用saxStream完成”);
})
让stream1=fs.createReadStream(“./sample1.xml”);
让stream2=fs.createReadStream(“./sample2.xml”);
saxStream.write(“”);
stream1.pipe(saxStream,{end:false});
stream1.on(“结束”,()=>{
console.log(“启动stream2”)
stream2.pipe(saxStream,{end:false});
stream2.on(“结束”,()=>{
saxStream.write(“”);
saxStream.end();
});
});

一个接一个地将它们传输到sax?@jfriend00,听起来很有希望!我该怎么做?你想在这里完成什么?SAX是一个XML解析器,对吗?那么,对于两个输入,您想要什么类型的输出?您使用的是哪一个SAX库(请提供精确模块的NPM链接)?@jfriend00,我用您问题的答案更新了问题。如果您还需要了解其他信息,请告诉我。请链接到您正在使用的NPM模块,而不是压缩档案。我们希望看到文档和在线源代码,而不是下载和解压缩。这里的想法是让人们尽可能容易地帮助你。越是困难,就越不会有那么多人会遇到麻烦去帮助他们。