-
-
Save chinchang/8106a82c56ad007e27b1 to your computer and use it in GitHub Desktop.
/** | |
* 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); | |
*/ |
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...
Hi @chinchang, how we can convert XML file to JSON string?
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 !!!
Love you <3 <3
Thank You very much @chinchang
In case someone needs it, here is the ES6 version:
https://gist.github.com/demircancelebi/f0a9c7e1f48be4ea91ca7ad81134459d
THANK YOU SO MUCH!!! GOD BLESS YOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Your Logic Building is strong. Keep it Up
You're a lifesaver!
Worked like a charm
Wow Wow Wow Wow Wow guy u are a king @loveUGuy
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
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)
});
}`
I love you.
👍 😄
Updated with examples of how to use the function.
@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);
how if contains cdata in a tags?
Thanks.
Has anyone gotten it to work with creating an array?
thank you!
I am facing an error " cannot convert undefined or null to object " in line 23
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.