XML回転JSON

19806 ワード

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の相応する各ノードを生成します.