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网络游戏-(模拟城市webgame)提供的一些例子下载
Oct 14 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
Jun 21 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
Dec 02 Javascript
Javascript开发之三数组对象实例介绍
Nov 12 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
详解vue 兼容IE报错解决方案
Dec 29 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
Jan 18 Javascript
JS+Canvas实现五子棋游戏
Aug 26 Javascript
React Ant Design树形表格的复杂增删改操作
Nov 02 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投票系统防刷票判断流程分析
2012/02/04 PHP
『PHP』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
&amp;lt;script defer&amp;gt; defer 是什么意思
2009/05/10 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
Python中字典和JSON互转操作实例
2015/01/19 Python
python数据结构之链表的实例讲解
2017/07/25 Python
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
函授自我鉴定
2013/11/06 职场文书
小学二年级评语
2014/04/21 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
三人合伙协议书范本
2014/10/29 职场文书
超市员工管理制度
2015/08/06 职场文书
中学生运动会广播稿
2015/08/19 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
MySQL创建高性能索引的全步骤
2021/05/02 MySQL
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android