Skip to content

Instantly share code, notes, and snippets.

@chinchang
Last active March 30, 2026 14:21
Show Gist options
  • Select an option

  • Save chinchang/8106a82c56ad007e27b1 to your computer and use it in GitHub Desktop.

Select an option

Save chinchang/8106a82c56ad007e27b1 to your computer and use it in GitHub Desktop.
Function to convert XML to JSON
/**
* Changes XML to JSON
* Modified version from here: http://davidwalsh.name/convert-xml-json
* @param {string} xml XML DOM tree
*/
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 all text nodes inside, get concatenated text from them.
var textNodes = [].slice.call(xml.childNodes).filter(function(node) {
return node.nodeType === 3;
});
if (xml.hasChildNodes() && xml.childNodes.length === textNodes.length) {
obj = [].slice.call(xml.childNodes).reduce(function(text, node) {
return text + node.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;
}
/*
Usage:
1. If you have an XML file URL:
const response = await fetch('file_url');
const xmlString = await response.text();
var XmlNode = new DOMParser().parseFromString(xmlString, 'text/xml');
xmlToJson(XmlNode);
2. If you have an XML as string:
var XmlNode = new DOMParser().parseFromString(yourXmlString, 'text/xml');
xmlToJson(XmlNode);
3. If you have the XML as a DOM Node:
xmlToJson(YourXmlNode);
*/
@charith93

Copy link
Copy Markdown

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

salshyn commented Apr 4, 2017

Copy link
Copy Markdown

Having the same issue as @charith93.

@LuceroGera

Copy link
Copy Markdown

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

Thanks.

@vivekannan

Copy link
Copy Markdown

@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);

@jasminejeane

Copy link
Copy Markdown

@vivekannan worked like a charm. Thank you

@maxIrvine

Copy link
Copy Markdown

Super helpful! Thank you!

@vibhorejaiswal

Copy link
Copy Markdown

Thank you very much !!

It worked great !!

@ashishsurana

Copy link
Copy Markdown

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

@theo-armour

Copy link
Copy Markdown

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.

ghost commented Sep 6, 2017

Copy link
Copy Markdown

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

baladkb commented Oct 12, 2017

Copy link
Copy Markdown

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

@truongphucuong

truongphucuong commented Oct 18, 2017

Copy link
Copy Markdown

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

@linhnt2803

Copy link
Copy Markdown

Love you <3 <3

@satriowibowo123

Copy link
Copy Markdown

Thank You very much @chinchang

@demircancelebi

Copy link
Copy Markdown

In case someone needs it, here is the ES6 version:

https://gist.github.com/demircancelebi/f0a9c7e1f48be4ea91ca7ad81134459d

@chhonmeily

Copy link
Copy Markdown

THANK YOU SO MUCH!!! GOD BLESS YOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

@Teclogen

Teclogen commented Sep 5, 2018

Copy link
Copy Markdown

Your Logic Building is strong. Keep it Up

@iPzard

iPzard commented Nov 29, 2018

Copy link
Copy Markdown

You're a lifesaver!

@IlkerKadir

Copy link
Copy Markdown

Worked like a charm

@mombe090

Copy link
Copy Markdown

Wow Wow Wow Wow Wow guy u are a king @loveUGuy

@varadekd

Copy link
Copy Markdown

I am using the same code But when I am using the same code inside try and catch it is failing. The code was working fine but after updating node to 11.10.0, npm 6.8.0 and appium 1.11

@obisi7

obisi7 commented Apr 24, 2019

Copy link
Copy Markdown

Thanks for the code. I tried using the final version within a fetch call as shown below but I am getting this error: "Fetch TypeError: (0, _xmlTpJson.default) is undefined. I can't find any insight to the error or how to fix it. Please help and thanks.

` getNews() {
const link = "https://feeds.feedburner.com/morganstateu";

return fetch(link)
  .then(response => response.text())
  .then(response => {
    let resJson = xmlToJson(response);
    this.setState({
      data: resJson.rss.channel[0].item,
      isLoading: false,
      refreshing: false,
      error: response.error || null
    });
  })
  .catch(error => {
    this.setState({ error, isLoading: false });
    // Alert.alert("Error", "Sorry, something went wrong. Please try again");
    console.log('fetch', error)
  });

}`

ghost commented Jun 19, 2019

Copy link
Copy Markdown

I love you.
๐Ÿ‘ ๐Ÿ˜„

@chinchang

Copy link
Copy Markdown
Author

Updated with examples of how to use the function.

@chinchang

Copy link
Copy Markdown
Author

@obisi7
You need to convert the response string into DOM before passing to xmlToJson:

let node = new DOMParser().parseFromString(response, 'text/xml')
let resJson = xmlToJson(node);

@themikesam

Copy link
Copy Markdown

how if contains cdata in a tags?

@oziresrds

Copy link
Copy Markdown

Thanks.

@olopsman

Copy link
Copy Markdown

Has anyone gotten it to work with creating an array?

@lhalvesf

Copy link
Copy Markdown

thank you!

@Qasim118

Copy link
Copy Markdown

I am facing an error " cannot convert undefined or null to object " in line 23

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