通过js把xml转化成json

来源:互联网 发布:高淇java源代码 编辑:程序博客网 时间:2024/06/06 07:51

         在使用Ajax的时候,通常是将数据以XML的格式返回客户端,然后使用Javascript解析DOM结构。但W3C自带的方法和属性在操作的时候不是很方便。从网上找到一个SoftXMLLib.js,提供了使用XPATH访问节点的方式。对于复杂结构的XML是比较合适的。处理一般的XML,可以通过以下的方法,将XML转换成JSON后,访问节点的时候格式很简单。

xmlToJson={
    parser:function(xmlcode,ignoretags,debug){

        //@ xmlcode 为xml数据

        //@ignoretags 代表 "不进行转换的tags" (形式可以'b,i'  ,表示不转换<b>和<i>:)

       //@表明希望返回一个 JSON structure 的字符串,而不是JSON object. 默认为object

xmlToJson={

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

}

};

原创粉丝点击