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 相关文章推荐
JQUERY实现左侧TIPS滑进滑出效果示例
Jun 27 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
Jul 03 Javascript
如何在父窗口中得知window.open()出的子窗口关闭事件
Oct 15 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
Dec 03 Javascript
PHPExcel中的一些常用方法汇总
Jan 23 Javascript
第七章之菜单按钮图标组件
Apr 25 Javascript
教你用十行node.js代码读取docx的文本
Mar 08 Javascript
JavaScript的setter与getter方法
Nov 29 Javascript
mui back 返回刷新页面的实例
Dec 06 Javascript
JS内部事件机制之单线程原理
Jul 02 Javascript
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
Sep 14 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
终于听上了直流胆调频
2021/03/02 无线电
下载文件的点击数回填
2006/10/09 PHP
sae使用smarty模板的方法
2013/12/17 PHP
9个比较实用的php代码片段
2016/03/15 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
AngularJS使用ng-repeat指令实现下拉框
2016/08/23 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
通过数据库向Django模型添加字段的示例
2015/07/21 Python
星球大战与Python之间的那些事
2016/01/07 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
python3.x实现发送邮件功能
2018/05/22 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Python创建数字列表的示例
2019/11/28 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
python获取栅格点和面值的实现
2020/03/10 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
详解Python模块化编程与装饰器
2021/01/16 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
房产公证委托书范本
2014/09/20 职场文书
八年级物理教学反思
2016/02/19 职场文书
Python中requests做接口测试的方法
2021/05/30 Python