Last active
September 7, 2023 02:39
-
-
Save chinchang/8106a82c56ad007e27b1 to your computer and use it in GitHub Desktop.
Function to convert XML to JSON
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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); | |
*/ |
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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";
}`