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 相关文章推荐
从js向Action传中文参数出现乱码问题的解决方法
Dec 29 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
Apr 20 Javascript
javascript中Date()函数在各浏览器中的显示效果
Jun 18 Javascript
jQuery插件实现文件上传功能(支持拖拽)
Aug 27 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
Aug 23 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
js学习总结_选项卡封装(实例讲解)
Jul 13 Javascript
react项目实践之webpack-dev-serve
Sep 14 Javascript
详解Vue中watch对象内属性的方法
Feb 01 Javascript
vue无限轮播插件代码实例
May 10 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
vue3.0 自适应不同分辨率电脑的操作
Feb 06 Vue.js
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基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
js中的 || 与 &amp;&amp; 运算符详解
2018/05/24 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
用Python抢过年的火车票附源码
2015/12/07 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
python实现12306抢票及自动邮件发送提醒付款功能
2018/03/08 Python
python如何输出反斜杠
2020/06/18 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
服务员岗位职责
2014/01/29 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书