basic XML import works + small fixes

This commit is contained in:
Jan Prochazka
2022-01-30 11:26:10 +01:00
parent 91a77765b6
commit 8bad6da348
7 changed files with 75 additions and 18 deletions

View File

@@ -3,7 +3,7 @@ const stream = require('stream');
const NodeXmlStream = require('node-xml-stream');
class ParseStream extends stream.Transform {
constructor({ elementName }) {
constructor({ itemElementName }) {
super({ objectMode: true });
this.rowsWritten = 0;
this.parser = new NodeXmlStream();
@@ -17,7 +17,7 @@ class ParseStream extends stream.Transform {
}
});
this.parser.on('closetag', (name, attrs) => {
if (name == elementName) {
if (name == itemElementName) {
this.rowsWritten += 1;
this.push({ ...this.stack[this.stack.length - 1].attrs, ...this.stack[this.stack.length - 1].nodes });
}
@@ -30,11 +30,11 @@ class ParseStream extends stream.Transform {
}
}
async function reader({ fileName, encoding = 'utf-8', elementName }) {
async function reader({ fileName, encoding = 'utf-8', itemElementName }) {
console.log(`Reading file ${fileName}`);
const fileStream = fs.createReadStream(fileName, encoding);
const parser = new ParseStream({ elementName });
const parser = new ParseStream({ itemElementName });
fileStream.pipe(parser);
return parser;
}

View File

@@ -1,19 +1,68 @@
const fs = require('fs');
const stream = require('stream');
function escapeXml(value) {
return value.replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<':
return '&lt;';
case '>':
return '&gt;';
case '&':
return '&amp;';
case "'":
return '&apos;';
case '"':
return '&quot;';
}
});
}
class StringifyStream extends stream.Transform {
constructor() {
constructor({ itemElementName, rootElementName }) {
super({ objectMode: true });
this.itemElementName = itemElementName;
this.rootElementName = rootElementName;
this.startElement(this.rootElementName);
}
startElement(element) {
this.push('<');
this.push(element);
this.push('>\n');
}
endElement(element) {
this.push('</');
this.push(element);
this.push('>\n');
}
elementValue(element, value) {
this.startElement(element);
this.push(escapeXml(`${value}`));
this.endElement(element);
}
_transform(chunk, encoding, done) {
this.push(JSON.stringify(chunk) + '\n');
this.startElement(this.itemElementName);
for (const key of Object.keys(chunk)) {
this.elementValue(key, chunk[key]);
}
this.endElement(this.itemElementName);
done();
}
_final(callback) {
this.endElement(this.rootElementName);
callback();
}
}
async function writer({ fileName, encoding = 'utf-8' }) {
async function writer({ fileName, encoding = 'utf-8', itemElementName, rootElementName }) {
console.log(`Writing file ${fileName}`);
const stringify = new StringifyStream();
const stringify = new StringifyStream({ itemElementName, rootElementName });
const fileStream = fs.createWriteStream(fileName, encoding);
stringify.pipe(fileStream);
stringify['finisher'] = fileStream;