我对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
好,我尝试编码一种方法来执行此操作,但是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();
});
});