JS操作xml对象转换为Json对象
最近在处理一个前端功能的时候,遇到了一个问题,原本的系统是使用的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对象。