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程序设计有所帮助。