欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js实现的xml对象转json功能示例

程序员文章站 2022-09-27 14:15:17
本文实例讲述了js实现的xml对象转json功能。分享给大家供大家参考,具体如下: 支持无限级别xml结构对象转json,并且支持任意标签属性转json(兼容ie8等浏览...

本文实例讲述了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"
  }
]

ps:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

在线xml/json互相转换工具:

在线格式化xml/在线压缩xml:

xml在线压缩/格式化工具:

xml代码在线格式化美化工具:

更多关于javascript相关内容可查看本站专题:《javascript操作xml文件技巧总结》、《javascript中json操作技巧总结》、《javascript查找算法技巧总结》、《javascript错误与调试技巧总结》、《javascript数据结构与算法技巧总结》、《javascript遍历算法与技巧总结》及《javascript数学运算用法总结

希望本文所述对大家javascript程序设计有所帮助。