Skip to content

Instantly share code, notes, and snippets.

@chinchang
Last active September 7, 2023 02:39
Show Gist options
  • Save chinchang/8106a82c56ad007e27b1 to your computer and use it in GitHub Desktop.
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);
*/
@jasminejeane
Copy link

@vivekannan worked like a charm. Thank you

@maxIrvine
Copy link

Super helpful! Thank you!

@vibhorejaiswal
Copy link

Thank you very much !!

It worked great !!

@ashishsurana
Copy link

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

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.

Copy link

ghost commented Sep 6, 2017

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
Copy link

baladkb commented Oct 12, 2017

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

@truongphucuong
Copy link

truongphucuong commented Oct 18, 2017

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

Love you <3 <3

@satriowibowo123
Copy link

Thank You very much @chinchang

@demircancelebi
Copy link

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

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

@chhonmeily
Copy link

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

@Teclogen
Copy link

Teclogen commented Sep 5, 2018

Your Logic Building is strong. Keep it Up

@iPzard
Copy link

iPzard commented Nov 29, 2018

You're a lifesaver!

@IlkerKadir
Copy link

Worked like a charm

@mombe090
Copy link

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

@varadekd
Copy link

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
Copy link

obisi7 commented Apr 24, 2019

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

}`

Copy link

ghost commented Jun 19, 2019

I love you.
👍 😄

@chinchang
Copy link
Author

Updated with examples of how to use the function.

@chinchang
Copy link
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

how if contains cdata in a tags?

@oziresrds
Copy link

Thanks.

@olopsman
Copy link

Has anyone gotten it to work with creating an array?

@lhalvesf
Copy link

thank you!

@Qasim118
Copy link

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