-
-
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); | |
*/ |
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
Love you <3 <3