Created
March 26, 2012 12:59
-
-
Save stefanocudini/2204885 to your computer and use it in GitHub Desktop.
xml to json
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| xml2json={ | |
| parser:function(xmlcode,ignoretags,debug){ | |
| if(!ignoretags){ignoretags=""}; | |
| xmlcode=xmlcode.replace(/\s*\/>/g,'/>'); | |
| xmlcode=xmlcode.replace(/<\?[^>]*>/g,"").replace(/<\![^>]*>/g,""); | |
| if (!ignoretags.sort){ignoretags=ignoretags.split(",")}; | |
| var x=this.no_fast_endings(xmlcode); | |
| x=this.attris_to_tags(x); | |
| x=escape(x); | |
| x=x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join("\""); | |
| for (var i=0;i<ignoretags.length;i++){ | |
| x=x.replace(new RegExp("<"+ignoretags[i]+">","g"),"*$**"+ignoretags[i]+"**$*"); | |
| x=x.replace(new RegExp("</"+ignoretags[i]+">","g"),"*$***"+ignoretags[i]+"**$*") | |
| }; | |
| x='<JSONTAGWRAPPER>'+x+'</JSONTAGWRAPPER>'; | |
| this.xmlobject={}; | |
| var y=this.xml_to_object(x).jsontagwrapper; | |
| if(debug){y=this.show_json_structure(y,debug)}; | |
| return y | |
| }, | |
| xml_to_object:function(xmlcode){ | |
| var x=xmlcode.replace(/<\//g,"§"); | |
| x=x.split("<"); | |
| var y=[]; | |
| var level=0; | |
| var opentags=[]; | |
| for (var i=1;i<x.length;i++){ | |
| var tagname=x[i].split(">")[0]; | |
| opentags.push(tagname); | |
| level++ | |
| y.push(level+"<"+x[i].split("§")[0]); | |
| while(x[i].indexOf("§"+opentags[opentags.length-1]+">")>=0){level--;opentags.pop()} | |
| }; | |
| var oldniva=-1; | |
| var objname="this.xmlobject"; | |
| for (var i=0;i<y.length;i++){ | |
| var preeval=""; | |
| var niva=y[i].split("<")[0]; | |
| var tagnamn=y[i].split("<")[1].split(">")[0]; | |
| tagnamn=tagnamn.toLowerCase(); | |
| var rest=y[i].split(">")[1]; | |
| if(niva<=oldniva){ | |
| var tabort=oldniva-niva+1; | |
| for (var j=0;j<tabort;j++){objname=objname.substring(0,objname.lastIndexOf("."))} | |
| }; | |
| objname+="."+tagnamn; | |
| var pobject=objname.substring(0,objname.lastIndexOf(".")); | |
| if (eval("typeof "+pobject) != "object"){preeval+=pobject+"={value:"+pobject+"};\n"}; | |
| var objlast=objname.substring(objname.lastIndexOf(".")+1); | |
| var already=false; | |
| for (k in eval(pobject)){if(k==objlast){already=true}}; | |
| var onlywhites=true; | |
| for(var s=0;s<rest.length;s+=3){ | |
| if(rest.charAt(s)!="%"){onlywhites=false} | |
| }; | |
| if (rest!="" && !onlywhites){ | |
| if(rest/1!=rest){ | |
| rest="'"+rest.replace(/\'/g,"\\'")+"'"; | |
| rest=rest.replace(/\*\$\*\*\*/g,"</"); | |
| rest=rest.replace(/\*\$\*\*/g,"<"); | |
| rest=rest.replace(/\*\*\$\*/g,">") | |
| } | |
| } | |
| else {rest="{}"}; | |
| if(rest.charAt(0)=="'"){rest='unescape('+rest+')'}; | |
| if (already && !eval(objname+".sort")){preeval+=objname+"=["+objname+"];\n"}; | |
| var before="=";after=""; | |
| if (already){before=".push(";after=")"}; | |
| var toeval=preeval+objname+before+rest+after; | |
| eval(toeval); | |
| if(eval(objname+".sort")){objname+="["+eval(objname+".length-1")+"]"}; | |
| oldniva=niva | |
| }; | |
| return this.xmlobject | |
| }, | |
| show_json_structure:function(obj,debug,l){ | |
| var x=''; | |
| if (obj.sort){x+="[\n"} else {x+="{\n"}; | |
| for (var i in obj){ | |
| if (!obj.sort){x+=i+":"}; | |
| if (typeof obj[i] == "object"){ | |
| x+=this.show_json_structure(obj[i],false,1) | |
| } | |
| else { | |
| if(typeof obj[i]=="function"){ | |
| var v=obj[i]+""; | |
| //v=v.replace(/\t/g,""); | |
| x+=v | |
| } | |
| else if(typeof obj[i]!="string"){x+=obj[i]+",\n"} | |
| else {x+="'"+obj[i].replace(/\'/g,"\\'").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")+"',\n"} | |
| } | |
| }; | |
| if (obj.sort){x+="],\n"} else {x+="},\n"}; | |
| if (!l){ | |
| x=x.substring(0,x.lastIndexOf(",")); | |
| x=x.replace(new RegExp(",\n}","g"),"\n}"); | |
| x=x.replace(new RegExp(",\n]","g"),"\n]"); | |
| var y=x.split("\n");x=""; | |
| var lvl=0; | |
| for (var i=0;i<y.length;i++){ | |
| if(y[i].indexOf("}")>=0 || y[i].indexOf("]")>=0){lvl--}; | |
| tabs="";for(var j=0;j<lvl;j++){tabs+="\t"}; | |
| x+=tabs+y[i]+"\n"; | |
| if(y[i].indexOf("{")>=0 || y[i].indexOf("[")>=0){lvl++} | |
| }; | |
| if(debug=="html"){ | |
| x=x.replace(/</g,"<").replace(/>/g,">"); | |
| x=x.replace(/\n/g,"<BR>").replace(/\t/g," ") | |
| }; | |
| if (debug=="compact"){x=x.replace(/\n/g,"").replace(/\t/g,"")} | |
| }; | |
| return x | |
| }, | |
| no_fast_endings:function(x){ | |
| x=x.split("/>"); | |
| for (var i=1;i<x.length;i++){ | |
| var t=x[i-1].substring(x[i-1].lastIndexOf("<")+1).split(" ")[0]; | |
| x[i]="></"+t+">"+x[i] | |
| } ; | |
| x=x.join(""); | |
| return x | |
| }, | |
| attris_to_tags: function(x){ | |
| var d=' ="\''.split(""); | |
| x=x.split(">"); | |
| for (var i=0;i<x.length;i++){ | |
| var temp=x[i].split("<"); | |
| for (var r=0;r<4;r++){temp[0]=temp[0].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")}; | |
| if(temp[1]){ | |
| temp[1]=temp[1].replace(/'/g,'"'); | |
| temp[1]=temp[1].split('"'); | |
| for (var j=1;j<temp[1].length;j+=2){ | |
| for (var r=0;r<4;r++){temp[1][j]=temp[1][j].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")} | |
| }; | |
| temp[1]=temp[1].join('"') | |
| }; | |
| x[i]=temp.join("<") | |
| }; | |
| x=x.join(">"); | |
| x=x.replace(/ ([^=]*)=([^ |>]*)/g,"><$1>$2</$1"); | |
| x=x.replace(/>"/g,">").replace(/"</g,"<"); | |
| for (var r=0;r<4;r++){x=x.replace(new RegExp("_jsonconvtemp"+r+"_","g"),d[r])} ; | |
| return x | |
| } | |
| }; | |
| if(!Array.prototype.push){ | |
| Array.prototype.push=function(x){ | |
| this[this.length]=x; | |
| return true | |
| } | |
| }; | |
| if (!Array.prototype.pop){ | |
| Array.prototype.pop=function(){ | |
| var response = this[this.length-1]; | |
| this.length--; | |
| return response | |
| } | |
| }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment