前言:
公司一個老項目重構,后端返回數據為xml格式。
而現有的前后端分離開發中,后端大部分返回的都是json格式的數據給到前端,所以前端也是直接對后端返回的json數據進行解析。
因此就需要對老接口返回的xml數據進行轉換了,看了下老項目中對xml數據解析的相關代碼,有1700+行,可謂是比較恐怖了,因此決定直接將xml字符串轉換成json格式,以適應現有框架。
解決方案:
在接口請求封裝函數中對接口返回數據進行格式轉換操作,頁面的開發不受任何影響。
關鍵代碼:
1 /** 2 * xml字符串轉換xml對象數據 3 * @param {Object} xmlStr 4 */ 5 function xmlStr2XmlObj(xmlStr) { 6 var xmlObj = {}; 7 if (document.all) { 8 var xmlDom = new ActiveXObject("Microsoft.XMLDOM"); 9 xmlDom.loadXML(xmlStr); 10 xmlObj = xmlDom; 11 } else { 12 xmlObj = new DOMParser().parseFromString(xmlStr, "text/xml"); 13 } 14 return xmlObj; 15 } 16 17 /** 18 * xml字符串轉換json數據 19 * @param {Object} xml 20 */ 21 function xmlObj2json(xml) { 22 var xmlObj = xmlStr2XmlObj(xml); 23 var jsonObj = {}; 24 if (xmlObj.childNodes.length > 0) { 25 jsonObj = xml2json(xmlObj); 26 } 27 return jsonObj; 28 } 29 30 /** 31 * xml轉換json數據 32 * @param {Object} xml 33 */ 34 function xml2json(xml) { 35 try { 36 var obj = {}; 37 if (xml.children.length > 0) { 38 for (var i = 0; i < xml.children.length; i++) { 39 var item = xml.children.item(i); 40 var nodeName = item.nodeName; 41 if (typeof(obj[nodeName]) == "undefined") { 42 obj[nodeName] = xml2json(item); 43 } else { 44 if (typeof(obj[nodeName].push) == "undefined") { 45 var old = obj[nodeName]; 46 obj[nodeName] = []; 47 obj[nodeName].push(old); 48 } 49 obj[nodeName].push(xml2json(item)); 50 } 51 } 52 } else { 53 obj = xml.textContent; 54 } 55 return obj; 56 } catch (e) { 57 console.log(e.message); 58 } 59 }
以上代碼即實現了xml字符串到json格式數據的轉換,后邊會繼續寫問講解如何在axios請求封裝中進行具體操作。
