Что ж, я попытался написать код, чтобы сделать это, но парсер SAX принимает только один root узел на входе XML, поэтому, как только он закончил с первым файлом, он игнорирует все XML во втором XML вы кормите его, потому что он находится за пределами root узла.
Итак, если вы хотите проанализировать второй файл, похоже, вам нужно создать второй sax.createStream()
и передать ему второй файл. Как всегда, мы могли бы предложить вам более полное предложение, если бы вы показали нам, что вы на самом деле пытаетесь сделать с проанализированным XML вводом.
FYI, вот что я попробовал:
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, он просто игнорирует его, потому что он находится за пределами узла root.
Есть несколько мест в этот файл , где он проверяет parser.closedRoot
и, если это так, пропускает содержимое.
На самом деле, я заставил его работать, добавив поддельный тег root, который мог заключите оба набора 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();
});
});