Работа над XmlParser

This commit is contained in:
Book Pauk
2022-11-08 02:21:34 +07:00
parent 8f4dec510c
commit d2484659e7
2 changed files with 31 additions and 10 deletions

View File

@@ -131,6 +131,18 @@ class NodeObject extends NodeBase {
return null;
}
set value(v) {
switch (this.type) {
case NODE:
this.raw[3] = v;
break;
case TEXT:
case CDATA:
case COMMENT:
this.raw[1] = v;
}
}
add(node, after = '*') {
if (this.type !== NODE)
return;
@@ -338,20 +350,28 @@ class XmlParser extends NodeBase {
return new XmlParser(newRawNodes);
}
s(selector, self) {
$$(selector, self) {
return this.select(selector, self);
}
$$self(selector) {
return this.$$(selector, true);
}
selectFirst(selector, self) {
const result = this.select(selector, self);
const node = (result.count ? result.rawNodes[0] : null);
return this.toObject(node);
}
sf(selector, self) {
$(selector, self) {
return this.selectFirst(selector, self);
}
$self(selector) {
return this.$(selector, true);
}
toJson(options = {}) {
const {format = false} = options;
@@ -383,7 +403,6 @@ class XmlParser extends NodeBase {
for (const n of nodes) {
const node = new NodeObject(n);
lastType = node.type;
let open = '';
let body = '';
@@ -412,8 +431,8 @@ class XmlParser extends NodeBase {
close = `</${node.name}>`;
if (format) {
open = '\n' + ' '.repeat(depth) + open;
close = (deepType === NODE ? ' '.repeat(depth) : '') + close + '\n';
open = (lastType !== TEXT ? '\n' + ' '.repeat(depth) : '') + open;
close = (deepType === NODE ? '\n' + ' '.repeat(depth) : '') + close;
}
} else if (node.type === TEXT) {
body = node.value || '';
@@ -424,6 +443,7 @@ class XmlParser extends NodeBase {
}
result += `${open}${body}${close}`;
lastType = node.type;
}
deepType = lastType;
@@ -437,7 +457,7 @@ class XmlParser extends NodeBase {
fromString(xmlString, options = {}, pickNode = () => true) {
const parsed = [];
const root = this.createNode(parsed);
const root = this.createNode('root', null, parsed);//fake node
let node = root;
let route = '';
@@ -460,7 +480,7 @@ class XmlParser extends NodeBase {
if (ignoreNode)
return;
if (tail) {
if (tail && tail.trim() !== '') {
const parsedAttrs = sax.getAttrsSync(tail, lowerCase);
const attrs = new Map();
for (const attr of parsedAttrs.values()) {

View File

@@ -288,9 +288,11 @@ function getAttrsSync(tail, lowerCase = true) {
let inName = false;
let inValue = false;
let waitValue = false;
let waitEq = false;
let waitEq = true;
const pushResult = () => {
if (waitEq)
value = true;
if (lowerCase)
name = name.toLowerCase();
if (name != '') {
@@ -308,7 +310,7 @@ function getAttrsSync(tail, lowerCase = true) {
inName = false;
inValue = false;
waitValue = false;
waitEq = false;
waitEq = true;
};
tail = tail.replace(/[\t\n\r]/g, ' ');
@@ -321,7 +323,6 @@ function getAttrsSync(tail, lowerCase = true) {
else
pushResult();
} else if (inName) {
waitEq = true;
inName = false;
}
} else if (!inValue && c == '=') {