The following code can be used to convert XML to JSON.
define(["require", "exports", "N/xml"], function (require, exports, xmlModule) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.xml2json = exports.nsXMLToJSON = exports.xmlToJson = void 0;
//https://stackoverflow.com/a/57735605
const xmlToJson = (xmlString) => {
//This function refer to https://davidwalsh.name/convert-xml-json
const xmlToJsonParser = (xmlNode) => {
// Create the return object
var obj = Object.create(null);
if (xmlNode.nodeType == xmlModule.NodeType.ELEMENT_NODE) { // element
// do attributes
if (xmlNode.hasAttributes()) {
obj['@attributes'] = Object.create(null);
for (var j in xmlNode.attributes) {
if (xmlNode.hasAttribute({ name: j })) {
obj['@attributes'][j] = xmlNode.getAttribute({
name: j
});
}
}
}
}
else if (xmlNode.nodeType == xmlModule.NodeType.TEXT_NODE) { // text
obj = xmlNode.nodeValue;
}
// do children
if (xmlNode.hasChildNodes()) {
for (var i = 0, childLen = xmlNode.childNodes.length; i < childLen; i++) {
var childItem = xmlNode.childNodes[i];
var nodeName = childItem.nodeName;
if (nodeName in obj) {
if (!Array.isArray(obj[nodeName])) {
obj[nodeName] = [
obj[nodeName]
];
}
obj[nodeName].push(xmlToJson(childItem));
}
else {
obj[nodeName] = xmlToJson(childItem);
}
}
}
return obj;
};
var xmlObj = xmlModule.Parser.fromString({
text: xmlString
});
return xmlToJsonParser(xmlObj.documentElement);
};
exports.xmlToJson = xmlToJson;
//https://stackoverflow.com/a/57711582
const nsXMLToJSON = (xmlString) => {
//*********** HELPER FUNCTIONS ***********
const nsXMLToJSONDirty = (node) => {
var obj = {};
// @ts-ignore
if (!'nodeType' in node) {
return obj;
}
if (node.nodeType == 1 || node.nodeType == 'ELEMENT_NODE') {
if (Object.keys(node.attributes).length > 0) {
obj["@attributes"] = {};
for (var j in node.attributes) {
var attribute = node.attributes[j];
if (attribute) {
obj["@attributes"][attribute.name] = attribute.value;
}
}
}
}
else if (node.nodeType == 3 || node.nodeType == 'TEXT_NODE') {
obj = node.nodeValue;
}
if (node.hasChildNodes()) {
var childNodes = node.childNodes;
for (var k in childNodes) {
var item = childNodes[k];
var nodeName = item.nodeName;
if (typeof (obj[nodeName]) == "undefined") {
obj[nodeName] = nsXMLToJSONDirty(item); //run the function again
}
else {
if (typeof (obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(nsXMLToJSONDirty(item));
}
}
}
return obj;
};
const cleanObject = (myobj, recurse) => {
var myobjcopy = JSON.parse(JSON.stringify(myobj));
for (var i in myobjcopy) {
if (recurse && typeof myobjcopy[i] === 'object') {
if (i == "#text") {
delete myobjcopy[i];
}
else {
//Check if it only contains a text object
if (Object.keys(myobjcopy[i]).length == 1) {
if (typeof myobjcopy[i]['#text'] != "undefined") {
if (myobjcopy[i]['#text'] || myobjcopy[i]['#text'] == 0) {
myobjcopy[i] = myobjcopy[i]['#text'];
}
}
}
else {
//Handle empty objects
if (Object.keys(myobjcopy[i]).length == 0) {
myobjcopy[i] = undefined;
}
}
if (myobjcopy[i]) {
myobjcopy[i] = cleanObject(myobjcopy[i], recurse);
}
}
}
}
return myobjcopy;
};
var xmlObj = xmlModule.Parser.fromString({
text: xmlString
});
var obj = nsXMLToJSONDirty(xmlObj);
return cleanObject(obj, true);
};
exports.nsXMLToJSON = nsXMLToJSON;
const xml2json = {
parser: function (xmlcode, ignoretags = [], debug = false) {
xmlcode = xmlcode.replace(/s*/>/g, '/>');
xmlcode = xmlcode.replace(/<?[^>]*>/g, "").replace(/<![^>]*>/g, "");
var x = this.no_fast_endings(xmlcode);
x = this.attris_to_tags(x);
x = escape(x);
x = x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join(""");
for (var i = 0; i < ignoretags.length; i++) {
x = x.replace(new RegExp("<" + ignoretags[i] + ">", "g"), "*$**" + ignoretags[i] + "**$*");
x = x.replace(new RegExp("</" + ignoretags[i] + ">", "g"), "*$***" + ignoretags[i] + "**$*");
}
;
x = '<JSONTAGWRAPPER>' + x + '</JSONTAGWRAPPER>';
this.xmlobject = {};
var y = this.xml_to_object(x).jsontagwrapper;
if (debug) {
y = this.show_json_structure(y, debug);
}
;
return y;
},
xml_to_object: function (xmlcode) {
var x = xmlcode.replace(/<//g, "§");
x = x.split("<");
var y = [];
var level = 0;
var opentags = [];
for (var i = 1; i < x.length; i++) {
var tagname = x[i].split(">")[0];
opentags.push(tagname);
level++;
y.push(level + "<" + x[i].split("§")[0]);
while (x[i].indexOf("§" + opentags[opentags.length - 1] + ">") >= 0) {
level--;
opentags.pop();
}
}
;
var oldniva = -1;
var objname = "this.xmlobject";
for (var i = 0; i < y.length; i++) {
var preeval = "";
var niva = y[i].split("<")[0];
var tagnamn = y[i].split("<")[1].split(">")[0];
tagnamn = tagnamn.toLowerCase();
var rest = y[i].split(">")[1];
if (niva <= oldniva) {
var tabort = oldniva - niva + 1;
for (var j = 0; j < tabort; j++) {
objname = objname.substring(0, objname.lastIndexOf("."));
}
}
;
objname += "." + tagnamn;
var pobject = objname.substring(0, objname.lastIndexOf("."));
if (eval("typeof " + pobject) != "object") {
preeval += pobject + "={value:" + pobject + "};n";
}
;
var objlast = objname.substring(objname.lastIndexOf(".") + 1);
var already = false;
for (var k in eval(pobject)) {
if (k == objlast) {
already = true;
}
}
;
var onlywhites = true;
for (var s = 0; s < rest.length; s += 3) {
if (rest.charAt(s) != "%") {
onlywhites = false;
}
}
;
if (rest != "" && !onlywhites) {
if (rest / 1 != rest) {
rest = "'" + rest.replace(/'/g, "\'") + "'";
rest = rest.replace(/*$***/g, "</");
rest = rest.replace(/*$**/g, "<");
rest = rest.replace(/**$*/g, ">");
}
}
else {
rest = "{}";
}
;
if (rest.charAt(0) == "'") {
rest = 'unescape(' + rest + ')';
}
;
if (already && !eval(objname + ".sort")) {
preeval += objname + "=[" + objname + "];n";
}
;
var before = "=";
var after = "";
if (already) {
before = ".push(";
after = ")";
}
;
var toeval = preeval + objname + before + rest + after;
eval(toeval);
if (eval(objname + ".sort")) {
objname += "[" + eval(objname + ".length-1") + "]";
}
;
oldniva = niva;
}
;
return this.xmlobject;
},
show_json_structure: function (obj, debug, l) {
var x = '';
if (obj.sort) {
x += "[n";
}
else {
x += "{n";
}
;
for (var i in obj) {
if (!obj.sort) {
x += i + ":";
}
;
if (typeof obj[i] == "object") {
x += this.show_json_structure(obj[i], false, 1);
}
else {
if (typeof obj[i] == "function") {
var v = obj[i] + "";
//v=v.replace(/t/g,"");
x += v;
}
else if (typeof obj[i] != "string") {
x += obj[i] + ",n";
}
else {
x += "'" + obj[i].replace(/'/g, "\'").replace(/n/g, "\n").replace(/t/g, "\t").replace(/r/g, "\r") + "',n";
}
}
}
;
if (obj.sort) {
x += "],n";
}
else {
x += "},n";
}
;
if (!l) {
x = x.substring(0, x.lastIndexOf(","));
x = x.replace(new RegExp(",n}", "g"), "n}");
x = x.replace(new RegExp(",n]", "g"), "n]");
var y = x.split("n");
x = "";
var lvl = 0;
// @ts-ignore
for (var i = 0; i < y.length; i++) {
if (y[i].indexOf("}") >= 0 || y[i].indexOf("]") >= 0) {
lvl--;
}
;
var tabs = "";
for (var j = 0; j < lvl; j++) {
tabs += "t";
}
;
x += tabs + y[i] + "n";
if (y[i].indexOf("{") >= 0 || y[i].indexOf("[") >= 0) {
lvl++;
}
}
;
if (debug == "html") {
x = x.replace(/</g, "<").replace(/>/g, ">");
x = x.replace(/n/g, "<BR>").replace(/t/g, " ");
}
;
if (debug == "compact") {
x = x.replace(/n/g, "").replace(/t/g, "");
}
}
;
return x;
},
no_fast_endings: function (x) {
x = x.split("/>");
for (var i = 1; i < x.length; i++) {
var t = x[i - 1].substring(x[i - 1].lastIndexOf("<") + 1).split(" ")[0];
x[i] = "></" + t + ">" + x[i];
}
;
x = x.join("");
return x;
},
attris_to_tags: function (x) {
var d = ' ="''.split("");
x = x.split(">");
for (var i = 0; i < x.length; i++) {
var temp = x[i].split("<");
for (var r = 0; r < 4; r++) {
temp[0] = temp[0].replace(new RegExp(d[r], "g"), "_jsonconvtemp" + r + "_");
}
;
if (temp[1]) {
temp[1] = temp[1].replace(/'/g, '"');
temp[1] = temp[1].split('"');
for (var j = 1; j < temp[1].length; j += 2) {
for (var r = 0; r < 4; r++) {
temp[1][j] = temp[1][j].replace(new RegExp(d[r], "g"), "_jsonconvtemp" + r + "_");
}
}
;
temp[1] = temp[1].join('"');
}
;
x[i] = temp.join("<");
}
;
x = x.join(">");
x = x.replace(/ ([^=]*)=([^ |>]*)/g, "><$1>$2</$1");
x = x.replace(/>"/g, ">").replace(/"</g, "<");
for (var r = 0; r < 4; r++) {
x = x.replace(new RegExp("_jsonconvtemp" + r + "_", "g"), d[r]);
}
;
return x;
}
};
exports.xml2json = xml2json;
});