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 相关文章推荐
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
jQuery代码优化 遍历篇
Nov 01 Javascript
JavaScript栏目列表隐藏/显示简单实现
Apr 03 Javascript
单元选择合并变色示例代码
May 26 Javascript
jQuery语法小结(超实用)
Dec 31 Javascript
JavaScript驾驭网页-CSS与DOM
Mar 24 Javascript
很实用的js选项卡切换效果
Aug 12 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
Jul 24 Javascript
Angularjs单选框相关的示例代码
Aug 17 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
js的Object.assign用法示例分析
Mar 05 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基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
2015/12/12 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
PyQt5每天必学之拖放事件
2020/08/27 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
python批量创建指定名称的文件夹
2019/03/21 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
python实现简单的购物程序代码实例
2020/03/03 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
教育系毕业生中文求职信范文
2013/10/06 职场文书
你的创业计划书怎样才能打动风投
2014/02/06 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
优秀公益广告词大全
2014/03/19 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
企业文化学习心得体会
2016/01/21 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
python读取mnist数据集方法案例详解
2021/09/04 Python
JavaScript获取URL参数的方法分享
2022/04/07 Javascript
使用Python获取字典键对应值的方法
2022/04/26 Python