最近在處理一個前端功能的時候,遇到了一個問題,原本的系統是使用的xml來存儲數據的,而在新的系統上,想要轉換為json對象存儲,於是就考慮到直接將xml對象轉換為json對象。
目前為止,通用的轉換方式我還沒有找到,只有根據已知的xml對象結構來使用for循環不斷地賦值。
1 var xml = ······;//獲取xml對象 2 var objList = []; 3 for(var i = 0;i<xml.childNodes.length;i++){ 4 var obj = {}; 5 obj.attribute1 = xml.getAttribute("attribute1");//獲取節點屬性 6 obj.attribute2 = xml.getAttribute("attribute2"); 7 obj.children = []; 8 for(var x=0;x<xml.childNodes[i].childNodes.length;x++){ 9 var element = xml.childNodes[i].childNodes[x]; 10 var child = {}; 11 child.attribute1 = element.getAttribute("attribute1"); 12 child.attribute2 = element.getAttribute("attribute2"); 13 obj.children.push(child); 14 } 15 objList.push(obj); 16 }
for循環可以繼續嵌套下去,每一個新的json對象的屬性都可以自定義,但是在getAttribute()方法中一定要填寫自己所需要的存在的屬性。
這樣的方法看起來比較蠢,暫時先這樣用吧,等到我想到了更好的方法之后在考慮替換。
2017年3月26日補充:
1 var xml; 2 var jsonobj; 3 function Xml2Json(xml,jsonobj) { 4 for(var i = 0;i<xml.childNodes.length;i++){ 5 var nodes = xml.childNodes; 6 jsonobj.name = xml.getAttribute("name"); 7 //屬性還是要根據實際情況設置 8 jsonobj.children = []; 9 for(var x = 0;x<nodes.length;x++){ 10 jsonobj.children.push(nodes[x]); 11 } 12 if(nodes[i].hasChildNodes()){ 13 Xml2Json(nodes[i],jsonobj.children[i]); 14 } 15 } 16 }
以上方法理論上可以處理無限層級的xml對象,但有一點很麻煩,就是沒有把節點的屬性也完整賦給json對象。