js实现的xml对象转json功能示例
本文实例讲述了js实现的xml对象转json功能。分享给大家供大家参考,具体如下:
支持无限级别xml结构对象转json,并且支持任意标签属性转json(兼容ie8等浏览器)
xml字符串转xml对象:
functionloadXml(str){ if(str==null){ returnnull; } vardoc=str; try{ doc=createXMLDOM(); doc.async=false; doc.loadXML(str); }catch(e){ doc=$.parseXML(str); } returndoc; }
/** *xml对象转json对象 *xmlObj:xml对象 *nodename:节点路径('ROOT/ITEM') *isarray:true,强制返回数组对象 **/ functionxmltojson(xmlObj,nodename,isarray){ varobj=$(xmlObj); varitemobj={}; varnodenames=""; vargetAllAttrs=function(node){//递归解析xml转换成json对象 var_itemobj={}; varnotNull=false; varnodechilds=node.childNodes; varchildlenght=nodechilds.length; var_attrs=node.attributes; varfirstnodeName="#text"; try{ firstnodeName=nodechilds[0].nodeName; }catch(e){} if((childlenght>0&&firstnodeName!="#text")||_attrs.length>0){ var_childs=nodechilds; var_childslength=nodechilds.length; var_fileName_=""; if(undefined!=_attrs){ var_attrslength=_attrs.length; for(vari=0;i<_attrslength;i++){//解析xml节点属性 varattrname=_attrs[i].nodeName; varattrvalue=_attrs[i].nodeValue; _itemobj[attrname]=attrvalue; } } for(varj=0;j<_childslength;j++){//解析xml子节点 var_node=_childs[j]; var_fildName=_node.nodeName; if("#text"==_fildName){break;}; if(_itemobj[_fildName]!=undefined){//如果有重复的节点需要转为数组格式 if(!(_itemobj[_fildName]instanceofArray)){ vara=_itemobj[_fildName]; _itemobj[_fildName]=[a];//如果该节点出现大于一个的情况把第一个的值存放到数组中 } } var_fildValue=getAllAttrs(_node); try{ _itemobj[_fildName].push(_fildValue); }catch(e){ _itemobj[_fildName]=_fildValue; _itemobj["length"]=1; } } }else{ _itemobj=(node.textContent==undefined)?node.text:node.textContent; } return_itemobj; }; if(nodename){ nodenames=nodename.split("/") } for(vari=0;i<nodenames.length;i++){ obj=obj.find(nodenames[i]); } $(obj).each(function(key,item){ if(itemobj[item.nodeName]!=undefined){ if(!(itemobj[item.nodeName]instanceofArray)){ vara=itemobj[item.nodeName]; itemobj[item.nodeName]=[a]; } itemobj[item.nodeName].push(getAllAttrs(item)); }else{ if(nodenames.length>0){ itemobj[item.nodeName]=getAllAttrs(item); }else{ itemobj[item.firstChild.nodeName]=getAllAttrs(item.firstChild); } } }); if(nodenames.length>1){ itemobj=itemobj[nodenames[nodenames.length-1]]; } if(isarray&&!(itemobjinstanceofArray)&&itemobj!=undefined){ itemobj=[itemobj]; } returnitemobj; };
使用方法:
varxmlstr="<USERS>"+ "<USERstate='0'>"+ "<USERNAMEtype='String'>张三</USERNAME>"+ "<USERIDtype='String'>00001</USERID>"+ "</USER>"+ "<USERstate='1'>"+ "<USERNAMEtype='String'size='100'>李四</USERNAME>"+ "<USERID>00002</USERID>"+ "</USER>"+ "<USER>"+ "<USERNAME>李四</USERNAME>"+ "<USERID>00002</USERID>"+ "</USER>"+ "</USERS>"; varxmlobj=loadXml(xmlstr);
参数设置:
(1) xmltojson(xmlobj);//返回结果如下
{ "USERS":{ "USER":[ { "state":"0", "USERNAME":{ "type":"String" }, "length":1, "USERID":{ "type":"String" } }, { "state":"1", "USERNAME":{ "type":"String", "size":"100" }, "length":1, "USERID":"00002" }, { "USERNAME":"李四", "length":1, "USERID":"00002" } ], "length":1 } }
(2)xmltojson(xmlobj,'USERS/USER',true);返回结果如下:
[ { "state":"0", "USERNAME":{ "type":"String" }, "length":1, "USERID":{ "type":"String" } }, { "state":"1", "USERNAME":{ "type":"String", "size":"100" }, "length":1, "USERID":"00002" }, { "USERNAME":"李四", "length":1, "USERID":"00002" } ]
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson
在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat
XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress
XML代码在线格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat
更多关于JavaScript相关内容可查看本站专题:《JavaScript操作XML文件技巧总结》、《JavaScript中json操作技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。