Created
February 26, 2012 09:20
-
-
Save ku/1915592 to your computer and use it in GitHub Desktop.
xml to json converter; nodejs wrapper of xml2json.js
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
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
| #!/usr/bin/env node | |
| /* | |
| xml2json v 1.1 | |
| copyright 2005-2007 Thomas Frank | |
| This program is free software under the terms of the | |
| GNU General Public License version 2 as published by the Free | |
| Software Foundation. It is distributed without any warranty. | |
| */ | |
| 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 | |
| } | |
| }; | |
| function convert_to_json(xml) { | |
| //console.log(xml); | |
| var o = xml2json.parser(xml, '' ); | |
| console.log( JSON.stringify(o, null, ' ')); | |
| } | |
| var fs = require('fs'); | |
| if (process.argv.length >= 2) { | |
| var xml_string = fs.readFileSync(process.argv[2], 'utf-8'); | |
| convert_to_json(xml_string); | |
| } else { | |
| var stdin = process.openStdin(); | |
| var xml_string = ""; | |
| stdin.on('data', function(chunk) { | |
| xml_string += chunk; | |
| }); | |
| stdin.on('end', function() { | |
| convert_to_json(); | |
| }); | |
| } | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment