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 !!

Everything worked great but I was not able to parse it completely.
in XML i had data like <ekey pi="308309309">here_it_contains_the_ekey</ekey>
and in JSON, I'm getting the only {ekey : "here_it_contains_the_ekey"}
there is no existence of pi in parsed object

I had to delete the @ in front of attributes in order to get to the data using JavaScript objects dot notation

Otherwise, it just works. Bonus points for the code being almost simple enough for me to understand.

AAAAAAAHHHHHHHHH!!!
I can kiss you!

json.LE.math.image.textML.en is so much better than
xmlDoc.getElementsByTagName("LE")[0].getElementsByTagName("math")[0].getElementsByTagName("image")[0].getElementsByTagName("textML")[0].getElementsByTagName("en")[0].innerHTML

No fuss. It just worked also...

baladkb commented Oct 12, 2017 edited

Hi @chinchang, how we can convert XML file to JSON string?

truongphucuong commented Oct 18, 2017 edited

Hello @chinchang,
I have the same issue as @baladkb, how we can convert XML file to JSON string and convert JSON string to XML file ???
Help Me !!!

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