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


Posted in Javascript onDecember 24, 2016

本文实例讲述了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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 Javascript
JavaScript Event学习第六章 事件的访问
Feb 07 Javascript
jquery异步请求实例代码
Jun 21 Javascript
extjs3 combobox取value和text案例详解
Feb 06 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
Oct 23 Javascript
常用的JavaScript验证正则表达式汇总
Nov 26 Javascript
iframe里的页面禁止右键事件的方法
Jun 10 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
Jan 05 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
Dec 12 Javascript
AngularJS实现进度条功能示例
Jul 05 Javascript
Node.js使用Angular简单示例
May 11 Javascript
javascript浅层克隆、深度克隆对比及实例解析
Feb 09 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
Dec 24 #Javascript
浅析BootStrap中Modal(模态框)使用心得
Dec 24 #Javascript
纯JS实现表单验证实例
Dec 24 #Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
Dec 24 #Javascript
JS绘制微信小程序画布时钟
Dec 24 #Javascript
jQuery弹出窗口打开链接的实现代码
Dec 24 #Javascript
DropDownList控件绑定数据源的三种方法
Dec 24 #Javascript
You might like
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
js 提交和设置表单的值
2008/12/19 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
Python中的类学习笔记
2014/09/23 Python
跟老齐学Python之集合(set)
2014/09/24 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
Python使用folium excel绘制point
2019/01/03 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
巴西宠物商店:Cobasi
2019/04/19 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
医学实习生自我鉴定
2013/12/12 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
美术教师求职信范文
2015/03/20 职场文书
工地材料员岗位职责
2015/04/11 职场文书
考勤制度通知
2015/04/25 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
会计做账心得体会
2016/01/22 职场文书
七年级数学教学反思
2016/02/17 职场文书
php png失真的原因及解决办法
2021/11/17 PHP
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android