Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Convert XML Data to JSON Servicenow Integration

gajananvw
Tera Expert

How to convert XML data to JSON in ServiceNow Integration 

var xmldata = 'XML Response';
var xmlDoc = new XMLDocument2(); // Servicenow API used to parse XML
xmlDoc.parseXML(xmldata); // XML Parsed
var xmltostring = xmlDoc.toString();    // Need to convert XML data to string first 
var parsedXML= gs.xmlToJSON(xmltostring); // Servicenow GlideSystem API used to convert string XML data to JSON Object

var JSONTostring = JSON.stringify(parsedXML); 
var parseXMl = JSON.parse(JSONTostring);

 

// get your appropriate object (Key Value) using json (parseXMl ) object

4 REPLIES 4

Sankar N
Kilo Guru

To convert XML data to JSON in ServiceNow Integration, you can use the following code snippet:

 

var xmldata = 'XML Response'; // replace with your XML data
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmldata, "text/xml");
var json = {};
var node = xmlDoc.firstChild;
if (node) {
  json[node.nodeName] = xmlToJson(node);
}
 
function xmlToJson(xml) {
  var obj = {};
  if (xml.nodeType == 1) {
    if (xml.attributes.length > 0) {
      obj["@attributes"] = {};
      for (var j = 0; j < xml.attributes.length; j++) {
        var attribute = xml.attributes.item(j);
        obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
      }
    }
  } else if (xml.nodeType == 3) {
    obj = xml.nodeValue;
  }
  if (xml.hasChildNodes()) {
    for (var i = 0; i < xml.childNodes.length; i++) {
      var item = xml.childNodes.item(i);
      var nodeName = item.nodeName;
      if (typeof(json[nodeName]) == "undefined") {
        json[nodeName] = xmlToJson(item);
      } else {
        if (typeof(json[nodeName].push) == "undefined") {
          var old = json[nodeName];
          json[nodeName] = [];
          json[nodeName].push(old);
        }
        json[nodeName].push(xmlToJson(item));
      }
    }
  }
  return json;
}
 
var jsonString = JSON.stringify(json);

 

This code creates an XML document object using the DOMParser API, and then uses a recursive function to convert the XML data to a JSON object. Finally, the JSON object is converted to a JSON string using JSON.stringify(). You can modify the code as needed to fit your specific use case.

-O-
Kilo Patron

Most of the time you can write:

var o = gs.xmlToJSON(xmldata);

 

shallom
Tera Contributor

Hi @gajananvw  I have been facing the same problem, I even try 

 

 

new XMLDocument2();

 

 

After that I created My own JS code to extract with attributes in Scoped APP

 

var XmlToJson = Class.create();
XmlToJson.prototype = {
    initialize: function() {},
    convert: function(xml) {
        var xmlDoc = new XMLDocument2();
        xmlDoc.parseXML(xml);
        var root = xmlDoc.getDocumentElement();
        if (!root) {
            gs.error("Root element is null. Unable to parse XML.");
            return null;
        }
        var jsonResult = {};
        jsonResult[root.getNodeName()] = this.parseXmlToJson(root);
        return jsonResult;
    },
    isEmptyObject: function(obj) {
        return Object.keys(obj).length === 0;
    },
    parseXmlToJson: function(node) {
        if (!node) return null; // Check if node is null

        var jsonObject = {};

        // Get attributes (if any) with a null check
        var attrs = node.getAttributes();
        if (!this.isEmptyObject(attrs)) {
            jsonObject = attrs;
        }

        // Iterate through child nodes
        var childNodes = node.getChildNodeIterator();
        if (childNodes.hasNext()) {
            while (childNodes.hasNext()) {
                var childNode = childNodes.next();
                var childName = childNode.getNodeName();
                var childValue = childNode.getNodeValue();

                // Skip text nodes
                if (childName === "#text") {
                    if (!this.isEmptyObject(attrs)) {
                        jsonObject['value'] = childValue || null;
                    } else {
                        jsonObject = childValue || null;
                    }
                    continue;
                };

                if (childNode.isCDATANode()) {
                    jsonObject[childName] = childValue;
                } else if (!jsonObject[childName]) {
                    jsonObject[childName] = this.parseXmlToJson(childNode);
                } else {
                    // Handle cases where there are multiple nodes with the same name
                    if (!Array.isArray(jsonObject[childName])) {
                        jsonObject[childName] = [jsonObject[childName]];
                    }
                    jsonObject[childName].push(this.parseXmlToJson(childNode));
                }
            }
        } else if (this.isEmptyObject(attrs)) {
            // If there are no child nodes, get the node's value
            jsonObject = node.getNodeValue() || null;
        }

        return jsonObject;
    },
    type: 'XmlToJson'
};
var xml = "XML paylod";
gs.info(JSON.stringify(new XmlToJson().convert(xml), null, 2))

 

 

You can pass string XML.

 

Community Alums
Not applicable

If you want the other way around, object to xml, you can use this code 🙂

convertObjToXML(obj){
        var xml = '';
        for (var prop in obj) {
            xml += obj[prop] instanceof Array ? '' : "<" + prop + ">";
            if (obj[prop] instanceof Array) {
            for (var array in obj[prop]) {
                xml += "<" + prop + ">";
                xml += OBJtoXML(new Object(obj[prop][array]));
                xml += "</" + prop + ">";
            }
            } else if (typeof obj[prop] == "object") {
            xml += OBJtoXML(new Object(obj[prop]));
            } else {
            xml += obj[prop];
            }
            xml += obj[prop] instanceof Array ? '' : "</" + prop + ">";
        }
        var xml = xml.replace(/<\/?[0-9]{1,}>/g, '');
        return xml
    }