如何从Node中的两个文件创建一个读取流?

问题描述 投票:0回答:1

我对NodeJS流和fileStream非常陌生。我正在尝试使用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解析器:https://www.npmjs.com/package/sax

node.js fs sax node-streams
1个回答
0
投票

好,我尝试编码一种方法来执行此操作,但是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解析器中,由于它在根节点之外,因此它忽略了它。

this file中有多个地方检查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();
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.