网络编程
位置:首页>> 网络编程>> JavaScript>> js实现的xml对象转json功能示例

js实现的xml对象转json功能示例

作者:碉堡猫  发布时间:2024-04-19 10:41:59 

标签:js,xml,json

本文实例讲述了js实现的xml对象转json功能。分享给大家供大家参考,具体如下:

支持无限级别xml结构对象转json,并且支持任意标签属性转json(兼容ie8等浏览器)

xml字符串转xml对象:

function loadXml(str) {
 if (str == null) {
  return null;
 }
 var doc = str;
 try{
  doc = createXMLDOM();
  doc.async = false;
  doc.loadXML(str);
 }catch(e){
  doc = $.parseXML(str);
 }
 return doc;
}
/**
*xml对象转json对象
*xmlObj:xml对象
*nodename:节点路径('ROOT/ITEM')
*isarray:true,强制返回数组对象
**/
function xmltojson(xmlObj,nodename,isarray){
  var obj=$(xmlObj);
  var itemobj={};
  var nodenames="";
  var getAllAttrs=function(node){//递归解析xml 转换成json对象
     var _itemobj={};
     var notNull=false;
     var nodechilds=node.childNodes;
     var childlenght=nodechilds.length;
     var _attrs=node.attributes;
     var firstnodeName="#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(var i=0; i<_attrslength; i++){//解析xml节点属性
           var attrname=_attrs[i].nodeName;
           var attrvalue=_attrs[i].nodeValue;
           _itemobj[attrname]=attrvalue;
          }
        }
      for (var j = 0; j < _childslength; j++) {//解析xml子节点
         var _node = _childs[j];
         var _fildName = _node.nodeName;
         if("#text"==_fildName){break;};
         if(_itemobj[_fildName]!=undefined){//如果有重复的节点需要转为数组格式
           if(!(_itemobj[_fildName] instanceof Array)){
             var a=_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(var i=0;i<nodenames.length;i++){
    obj=obj.find(nodenames[i]);
  }
  $(obj).each(function(key,item){
    if(itemobj[item.nodeName]!=undefined){
      if(!(itemobj[item.nodeName] instanceof Array)){
        var a=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&&!(itemobj instanceof Array)&&itemobj!=undefined){
    itemobj=[itemobj];
  }
 return itemobj;
};

使用方法:

var xmlstr="<USERS>" +
       "<USER state='0'>" +
       "<USERNAME type='String'>张三</USERNAME>" +
       "<USERID type='String'>00001</USERID>" +
       "</USER>" +
       "<USER state='1'>" +
       "<USERNAME type='String' size='100'>李四</USERNAME>" +
       "<USERID>00002</USERID>" +
       "</USER>" +
       "<USER>" +
       "<USERNAME>李四</USERNAME>" +
       "<USERID>00002</USERID>" +
       "</USER>" +
       "</USERS>";
var xmlobj=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"
 }
]

希望本文所述对大家JavaScript程序设计有所帮助。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com