Как я могу создать один поток чтения из двух файлов в Node? - PullRequest
0 голосов
/ 28 марта 2020

Я довольно новичок в NodeJS потоках и fileStreams. Я пытаюсь проанализировать два XML файла, используя SAX. Мне удалось заставить его работать для одного файла:

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?


Обновление

I ' Я пытаюсь поместить вывод SAX в один файл. Вот SAX, который я использую, это парсер XML, который использует потоки: https://www.npmjs.com/package/sax

1 Ответ

1 голос
/ 03 апреля 2020

Что ж, я попытался написать код, чтобы сделать это, но парсер 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();
    });
});
...