z4x,本来打算单独写的,不过jquery的用户实在是很多,就搭搭这个顺风车吧,改造成jquery解析xml插件,用过的同事都说很好用哦。顺便加上一个反射方法。
该插件有两个方法:
1). z4x 解析xml并转化为json对象。
2). 反射方法,可以反射json对象。
0. jquery.z4x.js 源码:
$.extend({ z4x: function(s) { var dom; if (typeof(s) == "object") { dom = s; } else if (typeof(s) == "string") { if (window.ActiveXObject) { dom = new ActiveXObject("Microsoft.XmlDom"); dom.async = "false"; dom.loadXML(s); } else { dom = new DOMParser().parseFromString(s, "text/xml"); } } var _dig = function(ele) { var oo = {}; var alen = (ele.attributes) ? ele.attributes.length: 0; for (var i = 0; i < alen; i++) { oo["$" + ele.attributes[i].name] = ele.attributes[i].value; } var elen = ele.childNodes.length; if (elen == 0) return oo; var tem; for (var i = 0; i < elen; i++) { tem = oo[ele.childNodes[i].nodeName]; if (typeof(tem) == "undefined") { if (ele.childNodes[i].childNodes.length == 0) { if (ele.childNodes[i].nodeName == "#text" || ele.childNodes[i].nodeName == "#cdata-section") { oo["$$"] = ele.childNodes[i].nodeValue; } else { oo[ele.childNodes[i].nodeName] = [_dig(ele.childNodes[i])]; } } else { oo[ele.childNodes[i].nodeName] = [_dig(ele.childNodes[i])]; } } else { tem[tem.length] = _dig(ele.childNodes[i]); oo[ele.childNodes[i].nodeName] = tem; } } return oo; }; var oo = {}; oo[dom.documentElement.nodeName] = _dig(dom.documentElement); return oo; }, ref : function(o,sp) { sp = sp?sp:"\n"; var tem = []; for(var i in o) tem[tem.length]=i+":"+o[i]; return tem.join(sp); } });
使用举例:
1. a.xml
<?xml version="1.0" encoding="utf-8"?> <root> <a id="t1" desc="just test">abc</a> <b id="t2"><![CDATA[ <c>test</c> ]]></b> </root>
2. 调用
$(function(){ $.get("a.xml",function(data){ var json = $.z4x(data);//只需一步,即可变成json. alert($.ref(json));//反射json //alert($.ref(json.root));//继续反射,看看里面有什么 }); })
是不是很简单啊,快试试吧。