script for XML to JSON Parser

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, "&lt;").replace(/>/g, "&gt;");
                    x = x.replace(/n/g, "<BR>").replace(/t/g, "&nbsp;&nbsp;&nbsp;&nbsp;");
                }
                ;
                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;
});


Leave a comment

Your email address will not be published. Required fields are marked *