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

发布时间 - 2026-01-10 22:04:43    点击率:

本文实例讲述了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互相转换工具:
http://tools./code/xmljson

在线格式化XML/在线压缩XML:
http://tools./code/xmlformat

XML在线压缩/格式化工具:
http://tools./code/xml_format_compress

XML代码在线格式化美化工具:
http://tools./code/xmlcodeformat

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

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


# js  # xml  # json  # Java解析xml文件和json转换的方法(DOM4j解析)  # JS XMLHttpRequest原理与使用方法深入详解  # JS操作XML中DTD介绍及使用方法分析  # js使用xml数据载体实现城市省份二级联动效果  # 使用JS读取XML文件的方法  # js制作xml在线编辑器实例  # 李四  # 递归  # 相关内容  # 第一个  # 遍历  # 数据结构  # 给大家  # 转换成  # 更多关于  # 所述  # 几款  # 程序设计  # 转换工具  # 再为  # 参数设置  # 组中  # 操作技巧  # 讲述了  # node  # getAllAttrs 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何为API生成Swagger或OpenAPI文档  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  如何快速生成高效建站系统源代码?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  重庆市网站制作公司,重庆招聘网站哪个好?  网站图片在线制作软件,怎么在图片上做链接?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  敲碗10年!Mac系列传将迎来「触控与联网」双革新  PythonWeb开发入门教程_Flask快速构建Web应用  Java解压缩zip - 解压缩多个文件或文件夹实例  C++时间戳转换成日期时间的步骤和示例代码  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  利用vue写todolist单页应用  iOS验证手机号的正则表达式  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  SQL查询语句优化的实用方法总结  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何在阿里云域名上完成建站全流程?  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  微信推文制作网站有哪些,怎么做微信推文,急?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何做网站制作流程,*游戏网站怎么搭建?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何快速搭建二级域名独立网站?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  实例解析Array和String方法  如何用狗爹虚拟主机快速搭建网站?  如何确认建站备案号应放置的具体位置?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网