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

作者:碉堡猫 时间:2024-04-19 10:41:59 

本文实例讲述了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,xml,json
0
投稿

猜你喜欢

  • 使用python绘制温度变化雷达图

    2021-06-23 05:44:02
  • Python调用VBA实现保留原始样式的表格合并方法

    2022-10-18 02:40:45
  • 详解Python+Pyecharts实现漏斗图的绘制

    2022-07-07 10:22:42
  • Python制作动态字符图的实例

    2023-11-02 07:17:18
  • Python标准库calendar的使用方法

    2023-09-01 01:28:07
  • pytorch 如何使用float64训练

    2023-08-12 00:19:45
  • 在Python中使用异步Socket编程性能测试

    2023-04-20 23:19:56
  • numpy数组之存取文件的实现示例

    2021-02-20 11:32:57
  • mysql unix准换时间格式查找指定日期数据代码

    2024-01-16 00:35:24
  • Python+OpenCV+图片旋转并用原底色填充新四角的例子

    2022-09-07 14:11:23
  • Django--权限Permissions的例子

    2021-02-16 01:44:51
  • MySQL数据表添加字段的三种方式

    2024-01-13 10:49:30
  • Python3实现自定义比较排序/运算符

    2023-04-15 23:32:25
  • 语义化的HTML结构到底有何好处?

    2009-07-13 12:38:00
  • Python常用内置函数的使用教程详解

    2021-11-11 21:23:50
  • mysqlreport显示Com_中change_db占用比例高的问题的解决方法

    2024-01-26 03:17:38
  • mysql千万级数据大表该如何优化?

    2024-01-20 22:08:05
  • 使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子

    2023-08-26 23:12:32
  • Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    2023-06-15 22:47:05
  • oracle数据库中如何处理clob字段方法介绍

    2024-01-17 05:55:41
  • asp之家 网络编程 m.aspxhome.com