• XML转JSON


    Json数据如果作为配置文件比较难读懂,XML文件作为配置文件有先天的优势,容易读懂和配置,因此不考虑效率时,在页面中宁可用XML文件作为配置文件再用JS做一次转化把XML转成JSON使用

    比如如下相对比较复杂的XML

    <myobjects>
    
      <!--object 1-->
      <myobject>
        <id>yourID_1</id>
        <name>your name</name>
        <description>
          <![CDATA[Merck Biologics Pilot Plant  ]]>
        </description>
        <locations>
          <location>
            <name><![CDATA[your location]]></name>
            <description>
              <![CDATA[<div id="div_desc1">your description, can be with html tags</div>]]>
            </description>
            <link>http://www.google.co.uk</link>
            <top>65</top>
            <left>501</left>
            <content_top>-20</content_top>
            <content_left>0</content_left>
          </location>
        </locations>
      </myobject>
    
      <!--object 2-->
      <myobject>
        <id>yourID_2</id>
        <name>your name</name>
        <description><![CDATA[your description, can be with html tags]]></description>
        <locations>
          <location>
            <name><![CDATA[your location]]></name>
            <description>
              <![CDATA[<div id="div_desc2">your description, can be with html tags</div>       
            ]]>
            </description>
            <link>http://www.google.co.uk</link>
            <top>65</top>
            <left>350</left>
            <content_top>-20</content_top>
            <content_left>0</content_left>
          </location>
        </locations>
      </myobject>
    
    </myobjects>

    如果你要用时可能要读取连带Html内容片段一起使用,那么转Json 的Jquery扩展插件代码如下:

    (function ($) {
        //Converts XML DOM to JSON
        $.extend({
            xmlToJSON: function (xdoc) {
                try {
                    if (!xdoc) { return null; }
                    var tmpObj = {};
                    tmpObj.typeOf = "JSXBObject";
                    var xroot = (xdoc.nodeType == 9) ? xdoc.documentElement : xdoc;
                    tmpObj.RootName = xroot.nodeName || "";
                    if (xdoc.nodeType == 3 || xdoc.nodeType == 4) {//Text Value or CDATA
                        return xdoc.nodeValue;
                    }
    
                    //Alters attribute and collection names to comply with JS
                    function formatName(name) {
                        var regEx = /-/g;
                        var tName = String(name).replace(regEx, "_");
                        return tName;
                    }
                    //Set Attributes of an object
                    function setAttributes(obj, node) {
                        if (node.attributes.length > 0) {
                            var a = node.attributes.length - 1;
                            var attName;
                            obj._attributes = [];
                            do { //Order is irrelevant (speed-up)
                                attName = String(formatName(node.attributes[a].name));
                                obj._attributes.push(attName);                  //key
                                obj[attName] = $.trim(node.attributes[a].value);//value
                            } while (a--);
                        }
                    }
    
                    //Recursive JSON Assembler
                    //Set Object Nodes
                    function setObjects(obj, node) {
                        var elemName;    //Element name
                        var cnode;    //Current Node
                        var tObj;    //New subnode
                        var cName = "";
                        if (!node) { return null; }
                        //Set node attributes if any
                        if (node.attributes.length > 0) { setAttributes(obj, node); }
                        obj.Text = "";
                        if (node.hasChildNodes()) {
                            var nodeCount = node.childNodes.length - 1;
                            var n = 0;
                            do { //Order is irrelevant (speed-up)
                                cnode = node.childNodes[n];
                                switch (cnode.nodeType) {
                                    case 1: //Node
                                        //Process child nodes
                                        obj._children = [];
                                        //SOAP XML FIX to remove namespaces (i.e. soapenv:)
                                        elemName = (cnode.localName) ? cnode.localName : cnode.baseName;
                                        elemName = formatName(elemName);
                                        if (cName != elemName) { obj._children.push(elemName); }
                                        //Create sub elemns array
                                        if (!obj[elemName]) {
                                            obj[elemName] = []; //Create Collection
                                        }
                                        tObj = {};
                                        obj[elemName].push(tObj);
                                        if (cnode.attributes.length > 0) {
                                            setAttributes(tObj, cnode);
                                        }
    
                                        cName = elemName;
                                        if (cnode.hasChildNodes()) {
                                            setObjects(tObj, cnode); //Recursive Call
                                        }
                                        break;
                                    case 3: //Text Value
                                        obj.Text += $.trim(cnode.nodeValue);
                                        break;
                                    case 4: //CDATA
                                        obj.Text += (cnode.text) ? $.trim(cnode.text) : $.trim(cnode.nodeValue);
                                        break;
                                }
                            } while (n++ < nodeCount);
                        }
                    }
                    //START TO RUN
                    setObjects(tmpObj, xroot);
                    //Clean-up memmory
                    xdoc = null;
                    xroot = null;
                    return tmpObj;
    
                } catch (e) {
                    return null;
                }
            }
        });
    
    })(jQuery);

    其实实现原理比较简单,处理XML与JSON数据,比较通用的思路就是递归调用,设置好递归出口条件,然后循环读取节点和设置节点,读取XML每个节点的同时,生成JSON相应的每个节点。

  • 相关阅读:
    用hmac验证客户端的合法性
    初级版python登录验证,上传下载文件加MD5文件校验
    用python实现一个简单的聊天功能,tcp,udp,socketserver版本
    用struct模块解决tcp的粘包问题
    最简单的socket通信
    python中的单例模式
    python中的反射
    前端工程化思想
    h5移动端flexible源码适配终端解读以及常用sass函数
    Vue生命周期函数详解
  • 原文地址:https://www.cnblogs.com/fastmover/p/3863259.html
Copyright © 2020-2023  润新知