60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
'use strict';
|
|
|
|
var events = require('events');
|
|
var libxmljs = require('libxmljs');
|
|
|
|
class SaxLibxmljs extends events.EventEmitter {
|
|
constructor() {
|
|
super();
|
|
this.parser = new libxmljs.SaxPushParser();
|
|
|
|
this.parser.on("startElementNS", (name, attrs, prefix, uri, nss) => {
|
|
const a = {};
|
|
for (const attr of attrs) {
|
|
let name = attr[0];
|
|
if (attr[1]) name = attr[1] + ":" + name;
|
|
a[name] = attr[3];
|
|
}
|
|
for (const ns of nss) {
|
|
let name = "xmlns";
|
|
if (ns[0] !== null) {
|
|
name += ":" + ns[0];
|
|
}
|
|
a[name] = ns[1];
|
|
}
|
|
this.emit("startElement", (prefix ? prefix + ":" : "") + name, a);
|
|
});
|
|
|
|
this.parser.on("endElementNS", (name, prefix) => {
|
|
this.emit("endElement", (prefix ? prefix + ":" : "") + name);
|
|
});
|
|
|
|
this.parser.on("characters", (str) => {
|
|
this.emit("text", str);
|
|
});
|
|
|
|
this.parser.on("cadata", (str) => {
|
|
this.emit("text", str);
|
|
});
|
|
|
|
this.parser.on("error", (err) => {
|
|
this.emit("error", err);
|
|
});
|
|
}
|
|
|
|
write(data) {
|
|
if (typeof data !== "string") {
|
|
data = data.toString();
|
|
}
|
|
this.parser.push(data);
|
|
}
|
|
|
|
end(data) {
|
|
if (data) {
|
|
this.write(data);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = SaxLibxmljs;
|