XML回転JSON
19806 ワード
Jsonデータはコンフィギュレーションファイルとして読みづらい場合、XMLファイルはコンフィギュレーションファイルとして先天的な利点があり、読みやすく、コンフィギュレーションしやすいため、効率を考慮しない場合、ページではむしろXMLファイルをコンフィギュレーションファイルとしてJSで変換してXMLをJSONに変換して使用する
例えば、比較的複雑なXML
Htmlのコンテンツクリップとともに使用する場合は、JsonのJquery拡張プラグインコードを次のようにします.
実は実現原理は比較的に簡単で、XMLとJSONデータを処理して、比較的に通用する構想は再帰呼び出しで、再帰出口条件を設定して、それからノードと設定ノードを循環して、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の相応する各ノードを生成します.