Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Function to convert XML to JSON
// Changes XML to JSON
// Modified version from here: http://davidwalsh.name/convert-xml-json
function xmlToJson(xml) {
// Create the return object
var obj = {};
if (xml.nodeType == 1) { // element
// do attributes
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) { // text
obj = xml.nodeValue;
}
// do children
// If just one text node inside
if (xml.hasChildNodes() && xml.childNodes.length === 1 && xml.childNodes[0].nodeType === 3) {
obj = xml.childNodes[0].nodeValue;
}
else if (xml.hasChildNodes()) {
for(var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof(obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof(obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
}
return obj;
}

I love you.

lionel-augustelouis commented Jan 24, 2017 edited

Hi,
First thank you for the code ;)

Maybe an update that could help.
line.23 : Just add this && !obj["@attributes"] to keep attributes when node is type === 3 (text)

Hi,

Need a help urgently.
I am getting an error as "xml.hasChildNodes is not a function".

Will be very thankful if you could help me.

salshyn commented Apr 4, 2017

Having the same issue as @charith93.

Hello,
I have the same issue as @charith93 & @salshyn, someone can help us please?

Thanks.

@charith93 @LuceroGera @salshyn my guess is you are passing a string instead of a XML-DOM obj. Try this instead,

var xml = "The XML as String";
var xmlDOM = new DOMParser().parseFromString(xml, 'text/xml');

and then,

xmlToJson(xmlDOM);

@vivekannan worked like a charm. Thank you

Super helpful! Thank you!

Thank you very much !!

It worked great !!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment