Skip to content

Instantly share code, notes, and snippets.

@psynewave
Created August 25, 2020 18:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psynewave/5f5eb7d9dd14a9d07b46326fa43a64b7 to your computer and use it in GitHub Desktop.
Save psynewave/5f5eb7d9dd14a9d07b46326fa43a64b7 to your computer and use it in GitHub Desktop.
Fetch RSS and Convert to JSON
const RSS_URL = `https://cors-anywhere.herokuapp.com/https://archive.org/services/collection-rss.php?collection=podcast_jeff-regan-the-great-detec_426081250`;
const xmlToJson = (xml) => {
let obj = {};
try {
xml.hasChildNodes();
} catch (err) {
xml = new DOMParser().parseFromString(xml, "text/xml");
}
if (xml.nodeType === 1) {
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (let j = 0; j < xml.attributes.length; j += 1) {
const attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType === 3) {
obj = xml.nodeValue;
}
if (
xml.hasChildNodes() &&
xml.childNodes.length === 1 &&
xml.childNodes[0].nodeType === 3
) {
obj = xml.childNodes[0].nodeValue;
} else if (xml.hasChildNodes()) {
for (let i = 0; i < xml.childNodes.length; i += 1) {
const item = xml.childNodes.item(i);
const nodeName = item.nodeName;
if (typeof obj[nodeName] === "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof obj[nodeName].push === "undefined") {
const old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
}
return obj;
};
const rssFetch = async () => {
const initial = await fetch(RSS_URL);
const initialXml = await initial.text();
const xmlJson = xmlToJson(initialXml);
return xmlJson;
};
rssFetch().then((resp) => {
console.log(resp);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment