55 lines
2.1 KiB
JavaScript
55 lines
2.1 KiB
JavaScript
const parser = new DOMParser();
|
|
export function parseXML(xmlString) {
|
|
const xmlDocument = parser.parseFromString(xmlString, "application/xml");
|
|
if (xmlDocument.getElementsByTagName("parsererror").length > 0) {
|
|
throw new Error("DOMParser XML parsing error.");
|
|
}
|
|
const xmlToObj = (node) => {
|
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
if (node.textContent?.trim()) {
|
|
return node.textContent;
|
|
}
|
|
}
|
|
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
const element = node;
|
|
if (element.attributes.length === 0 && element.childNodes.length === 0) {
|
|
return "";
|
|
}
|
|
const obj = {};
|
|
const attributes = Array.from(element.attributes);
|
|
for (const attr of attributes) {
|
|
obj[`${attr.name}`] = attr.value;
|
|
}
|
|
const childNodes = Array.from(element.childNodes);
|
|
for (const child of childNodes) {
|
|
const childResult = xmlToObj(child);
|
|
if (childResult != null) {
|
|
const childName = child.nodeName;
|
|
if (childNodes.length === 1 && attributes.length === 0 && childName === "#text") {
|
|
return childResult;
|
|
}
|
|
if (obj[childName]) {
|
|
if (Array.isArray(obj[childName])) {
|
|
obj[childName].push(childResult);
|
|
}
|
|
else {
|
|
obj[childName] = [obj[childName], childResult];
|
|
}
|
|
}
|
|
else {
|
|
obj[childName] = childResult;
|
|
}
|
|
}
|
|
else if (childNodes.length === 1 && attributes.length === 0) {
|
|
return element.textContent;
|
|
}
|
|
}
|
|
return obj;
|
|
}
|
|
return null;
|
|
};
|
|
return {
|
|
[xmlDocument.documentElement.nodeName]: xmlToObj(xmlDocument.documentElement),
|
|
};
|
|
}
|