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 相关文章推荐
JavaScript让IE浏览器event对象符合W3C DOM标准
Nov 24 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
Jul 08 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
Sep 27 Javascript
利用JQuery制作符合Web标准的QQ弹出消息
Jan 14 Javascript
Zepto实现密码的隐藏/显示
Apr 07 Javascript
JS原型继承四步曲及原型继承图一览
Nov 28 Javascript
详解Jest结合Vue-test-utils使用的初步实践
Jun 27 Javascript
Vue实现多标签选择器
Nov 28 Javascript
vue从零实现一个消息通知组件的方法详解
Mar 16 Javascript
Paypal支付不完全指北
Jun 04 Javascript
详解React的回调渲染模式
Sep 10 Javascript
JS如何实现在弹出窗口中加载页面
Dec 03 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配置php-fpm启动参数及配置详解
2013/11/04 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
PHP反射API示例分享
2016/10/08 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
jquery常用操作小结
2014/07/21 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
在Python的Django框架中编写编译函数
2015/07/20 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
DJango的创建和使用详解(默认数据库sqlite3)
2019/11/18 Python
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
农民致富事迹材料
2014/01/23 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
2015年党总支工作总结
2015/05/25 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
“爱眼护眼,提前预防近视”倡议书3篇
2019/10/30 职场文书
利用python做表格数据处理
2021/04/13 Python
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL