微信小程序之XML字符串解析为JavaScript对象

微信小程序之XML字符串解析为JavaScript对象

介绍

在微信小程序中将xml字符串解析成JavaScript对象。

示例代码地址:https://gitee.com/lihaogn/XML2JSObject

使用说明
  1. 核心文件

    使用到了xmldom库:https://github.com/jindw/xmldom

    /common/common.js
    /lib/dom-parser.js
    /lib/dom.js
    /lib/entities.js
    /lib/sax.js
    
    /** /common/common.js */
    // 导入包
    var Parser = require('../lib/dom-parser.js');
    
    /**
     * 加载 xml-dom 对象
     * @param {string} txt 
     * @return 返回一个xml-dom对象
     */
    function loadXMLString(txt) {
      //新建DOM解析对象
      var parser = new Parser.DOMParser();
      //基于请求到的 XML数据 来构建DOM对象
      var xmlDoc = parser.parseFromString(txt, "text/xml");
    
      return xmlDoc;
    }
    
    /**
     * 解析node,解析xml辅助函数
     * @param {Element} node
     * @return 节点对象
     */
    function node2Obj(node) {
      let obj = {};
    
      if (node.hasChildNodes()) { // 如果该节点有子节点
        // 获取所有的子节点
        var childNodeList = node.childNodes;
        // 遍历子节点
        for (let i = 0; i < childNodeList.length; i++) {
          if (childNodeList[i].nodeType == 3) { // 子节点类型为文本
            // 获取文本节点的内容
            var content = childNodeList[i].nodeValue;
            // 返回节点内容
            return content;
          } else if (childNodeList[i].nodeType == 1) { // 子节点类型为元素
            if (obj[childNodeList[i].nodeName] != null) { // 表示有重复的节点
              let tmp = obj[childNodeList[i].nodeName];
              if (tmp instanceof Array) {
                tmp.push(node2Obj(childNodeList[i]));
              } else {
                obj[childNodeList[i].nodeName] = [];
                obj[childNodeList[i].nodeName].push(tmp);
                obj[childNodeList[i].nodeName].push(node2Obj(childNodeList[i]));
              }
            } else {
              obj[childNodeList[i].nodeName] = node2Obj(childNodeList[i]);
            }
          }
        }
      } else { // 该节点没有子节点
        return;
      }
      return obj;
    }
    
    /**
     * 解析xml字符串
     * @param {string} xmlText 
     * @param {string} baseNodeName 
     */
    function xml2Obj(xmlText, baseNodeName) {
      let nodeObj = {};
      // 获取到xml dom对象
      let xmlDoc = loadXMLString(xmlText);
      // 按元素名获取节点
      let baseNode_list = xmlDoc.getElementsByTagName(baseNodeName);
      if (baseNode_list.length > 1) {
        nodeObj[baseNodeName] = [];
        for (var i = 0; i < baseNode_list.length; i++) {
          nodeObj[baseNodeName][i] = node2Obj(baseNode_list[i]);
        }
      } else {
        nodeObj = {};
        nodeObj[baseNodeName] = node2Obj(baseNode_list[0]);
      }
      return nodeObj;
    }
    
    exports.xml2Obj = xml2Obj
    
  2. 在页面中使用,以page/index/index为例

    //index.js
    const app = getApp()
    // ***** 需要引入外部js文件
    var common = require('../../common/common.js');
    Page({
      data: {
      },
      onLoad: function () {
        // xml字符串
        var testxt =
          '<animals>' +
            '<pet>' +
              '<cat>' +
                '<name>tom</name>' +
                '<age>34</age>' +
              '</cat>' +
              '<cat>' +
                '<name>jack</name>' +
                '<age>12</age>' +
              '</cat>' +
              '<cat>' +
                '<name>alice</name>' +
                '<age>22</age>' +
              '</cat>' +
            '</pet>' +
            '<test>' +
              'test-txt' +
            '</test>' +
          '</animals>';
        // 你想解析的节点名
        var baseNodeName='animals';
        // 解析xml字符串,转换成js对象
        var resObj=common.xml2Obj(testxt,baseNodeName);
    
        console.log(resObj);
      },
    })
    // 结果:
    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值