繁体   English   中英

从 API 中提取数据作为 XML 并转换为 JSON

[英]Pulling data from API as XML and converting to JSON

这是我的第一个 javascript 项目,我试图从不同的 API 中提取数据以制作一个小型仪表板。 我正在从 XML 格式的 API 中提取数据,并希望将其直接转换为 JSON 并将其存储在变量中。

const testdataurl = 'https://api.data.abs.gov.au/data/ABS,RES_DWELL/3.3GBRI.Q';
    
async function getData() {
    const response = await fetch(testdataurl);
    data = await response.text();
    console.log(data);
    }

getData()

如果您想查看 XML,可以在上面的代码中看到 API 端点。 一旦将它拉到 JSON 并存储在变量中,对我来说最简单的方法是什么?

我已经研究过使用这个:

https://goessner.net/download/prj/jsonxml/

但我不确定如何最好地实现它。

谢谢

还有其他资源可以更好地解释如何将脚本导入您的 html 以使其在您的项目中可用。 引用的脚本足够小,我只需将片段复制/粘贴到单个帖子中即可。 由于某种原因,代码片段应该提供的 json 字符串返回了一个undefined段。 我不确定为什么会这样,但是在检查了 xml 和返回的字符串之后,它看起来并不重要,所以我只是在解析为对象之前将它从 json 字符串中删除。

请记住,由于 CORS,此代码不适用于 stackoverflow。 我在 api.data.abs.gov.au 网站上对其进行了测试以避免 CORS 问题。

希望这会有所帮助。

 function parseXml(xml) { var dom = null; if (window.DOMParser) { try { dom = (new DOMParser()).parseFromString(xml, "text/xml"); } catch (e) { dom = null; } } else if (window.ActiveXObject) { try { dom = new ActiveXObject('Microsoft.XMLDOM'); dom.async = false; if (!dom.loadXML(xml)) // parse error .. window.alert(dom.parseError.reason + dom.parseError.srcText); } catch (e) { dom = null; } } else alert("cannot parse xml string!"); return dom; } /* This work is licensed under Creative Commons GNU LGPL License. License: http://creativecommons.org/licenses/LGPL/2.1/ Version: 0.9 Author: Stefan Goessner/2006 Web: http://goessner.net/ */ function xml2json(xml, tab) { var X = { toObj: function(xml) { var o = {}; if (xml.nodeType==1) { // element node .. if (xml.attributes.length) // element with attributes .. for (var i=0; i<xml.attributes.length; i++) o["@"+xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue||"").toString(); if (xml.firstChild) { // element has child nodes .. var textChild=0, cdataChild=0, hasElementChild=false; for (var n=xml.firstChild; n; n=n.nextSibling) { if (n.nodeType==1) hasElementChild = true; else if (n.nodeType==3 && n.nodeValue.match(/[^ \\f\\n\\r\\t\\v]/)) textChild++; // non-whitespace text else if (n.nodeType==4) cdataChild++; // cdata section node } if (hasElementChild) { if (textChild < 2 && cdataChild < 2) { // structured element with evtl. a single text or/and cdata node .. X.removeWhite(xml); for (var n=xml.firstChild; n; n=n.nextSibling) { if (n.nodeType == 3) // text node o["#text"] = X.escape(n.nodeValue); else if (n.nodeType == 4) // cdata node o["#cdata"] = X.escape(n.nodeValue); else if (o[n.nodeName]) { // multiple occurence of element .. if (o[n.nodeName] instanceof Array) o[n.nodeName][o[n.nodeName].length] = X.toObj(n); else o[n.nodeName] = [o[n.nodeName], X.toObj(n)]; } else // first occurence of element.. o[n.nodeName] = X.toObj(n); } } else { // mixed content if (!xml.attributes.length) o = X.escape(X.innerXml(xml)); else o["#text"] = X.escape(X.innerXml(xml)); } } else if (textChild) { // pure text if (!xml.attributes.length) o = X.escape(X.innerXml(xml)); else o["#text"] = X.escape(X.innerXml(xml)); } else if (cdataChild) { // cdata if (cdataChild > 1) o = X.escape(X.innerXml(xml)); else for (var n=xml.firstChild; n; n=n.nextSibling) o["#cdata"] = X.escape(n.nodeValue); } } if (!xml.attributes.length && !xml.firstChild) o = null; } else if (xml.nodeType==9) { // document.node o = X.toObj(xml.documentElement); } else alert("unhandled node type: " + xml.nodeType); return o; }, toJson: function(o, name, ind) { var json = name ? ("\\""+name+"\\"") : ""; if (o instanceof Array) { for (var i=0,n=o.length; i<n; i++) o[i] = X.toJson(o[i], "", ind+"\\t"); json += (name?":[":"[") + (o.length > 1 ? ("\\n"+ind+"\\t"+o.join(",\\n"+ind+"\\t")+"\\n"+ind) : o.join("")) + "]"; } else if (o == null) json += (name&&":") + "null"; else if (typeof(o) == "object") { var arr = []; for (var m in o) arr[arr.length] = X.toJson(o[m], m, ind+"\\t"); json += (name?":{":"{") + (arr.length > 1 ? ("\\n"+ind+"\\t"+arr.join(",\\n"+ind+"\\t")+"\\n"+ind) : arr.join("")) + "}"; } else if (typeof(o) == "string") json += (name&&":") + "\\"" + o.toString() + "\\""; else json += (name&&":") + o.toString(); return json; }, innerXml: function(node) { var s = "" if ("innerHTML" in node) s = node.innerHTML; else { var asXml = function(n) { var s = ""; if (n.nodeType == 1) { s += "<" + n.nodeName; for (var i=0; i<n.attributes.length;i++) s += " " + n.attributes[i].nodeName + "=\\"" + (n.attributes[i].nodeValue||"").toString() + "\\""; if (n.firstChild) { s += ">"; for (var c=n.firstChild; c; c=c.nextSibling) s += asXml(c); s += "</"+n.nodeName+">"; } else s += "/>"; } else if (n.nodeType == 3) s += n.nodeValue; else if (n.nodeType == 4) s += "<![CDATA[" + n.nodeValue + "]]>"; return s; }; for (var c=node.firstChild; c; c=c.nextSibling) s += asXml(c); } return s; }, escape: function(txt) { return txt.replace(/[\\\\]/g, "\\\\\\\\") .replace(/[\\"]/g, '\\\\"') .replace(/[\\n]/g, '\\\\n') .replace(/[\\r]/g, '\\\\r'); }, removeWhite: function(e) { e.normalize(); for (var n = e.firstChild; n; ) { if (n.nodeType == 3) { // text node if (!n.nodeValue.match(/[^ \\f\\n\\r\\t\\v]/)) { // pure whitespace text node var nxt = n.nextSibling; e.removeChild(n); n = nxt; } else n = n.nextSibling; } else if (n.nodeType == 1) { // element node X.removeWhite(n); n = n.nextSibling; } else // any other node n = n.nextSibling; } return e; } }; if (xml.nodeType == 9) // document node xml = xml.documentElement; var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "\\t"); return "{\\n" + tab + (tab ? json.replace(/\\t/g, tab) : json.replace(/\\t|\\n/g, "")) + "\\n}"; } const testdataurl = 'https://api.data.abs.gov.au/data/ABS,RES_DWELL/3.3GBRI.Q'; async function getData() { const response = await fetch(testdataurl); data = await response.text(); const dom = parseXml(data); const myJsonStr = xml2json(dom); const fixedJsonStr = myJsonStr.replace(/\\nundefined/, ""); const jsonObj = JSON.parse(fixedJsonStr); console.log(jsonObj); } getData();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM