/**<br /> * Change JSON object to XML string.<br /> * The JSON object value must be a string,an array or object.<br /> * If the value is an integer or a float value,you must add " or ' to the value.<br /> * @author bitjjj<br /> * @param isPretty If format xml<br /> * @param separator Set line separator<br /> * @example var util = new JsonToXml(true); var result = util.toXml(JSONObject);<br /> * @return<br /> */<br />function JsonToXml(isPretty,separator){<br />this.result=[];<br />this.isPretty = !!isPretty;<br />this.separator = separator || "/r/n";</p><p>this.result.push("<?xml version=/"1.0/" encoding=/"utf-8/"?>");<br />if(this.isPretty){<br />//this.result.push(this.separator);<br />}<br />}</p><p>JsonToXml.prototype.spacialChars=["&","<",">","/"","'"];<br />JsonToXml.prototype.validChars:["&","<",">",""","'"],</p><p>JsonToXml.prototype.toString = function(){<br />return this.result.join("");<br />};</p><p>JsonToXml.prototype.replaceSpecialChar = function(s){</p><p> for(var i=0;i<this.spacialChars.length;i++){<br /> s=s.replace(new RegExp(this.spacialChars[i],"g"),this.validChars[i]);<br /> }<br /> return s;<br />};</p><p>JsonToXml.prototype.appendText = function(s){<br /> s = this.replaceSpecialChar(s);<br /> this.result.push(s);<br />};</p><p>JsonToXml.prototype.appendFlagBegin = function(s){</p><p>this.result.push("<"+s+">");<br />};</p><p>JsonToXml.prototype.appendFlagEnd = function(s){<br />this.result.push("</"+s+">");<br />if(this.isPretty){<br />//this.result.push(this.separator);<br />}<br />};</p><p>JsonToXml.prototype.each = function(arr,cb){<br />for(var i=0;i<arr.length;i++){<br />cb(i,arr[i]);<br />}<br />};</p><p>/**<br /> * format xml string to pretty string<br /> * @param xml string<br /> * @return pretty xml string<br /> * @reference http://stackoverflow.com/questions/376373/pretty-printing-xml-with-javascript<br /> */<br />JsonToXml.prototype.formatXml = function (xml) {<br />var formatted = [];<br />var reg = /(>)(<)(//*)/g;<br />xml = xml.replace(reg, '$1'+this.separator+'$2$3');<br />var pad = 0,self = this;<br />this.each(xml.split(this.separator), function(index, node) {<br />var indent = 0;<br />if (node.match( /.+<///w[^>]*>$/ )) {<br />indent = 0;<br />}<br />else if (node.match( /^<///w/ )) {<br />if (pad != 0) {<br />pad -= 1;<br />}<br />}<br />else if (node.match( /^</w[^>]*[^//]>.*$/ )) {<br />indent = 1;<br />}<br />else {<br />indent = 0;<br />}<br />var padding = '';<br />for (var i = 0; i < pad; i++) {<br />padding += ' ';<br />}<br />formatted.push(padding + node + self.separator);<br />pad += indent;<br />});<br />return formatted.join("");<br />}; </p><p>JsonToXml.prototype.toXml = function(json){<br />this._toXml(json);</p><p>if(this.isPretty){<br />return this.formatXml(this.toString());<br />}<br />return this.toString();<br />};</p><p>JsonToXml.prototype._toXml = function(json){</p><p> for(var tag in json){<br /> //need to handle Array object specially<br /> if(json[tag].constructor==Array){<br /> for(var i=0;i<json[tag].length;i++){<br /> this.appendFlagBegin(tag);<br /> var item = json[tag][i];<br /> if(item.constructor == Object){<br /> this._toXml(item);<br /> }<br /> else if(item.constructor == Array){<br /> var obj={};<br /> obj[tag]=item;<br /> this._toXml(obj);<br /> }<br /> else if(item.constructor == String){<br /> this.appendText(item);<br /> }<br /> this.appendFlagEnd(tag);<br /> }<br /> }<br /> else{<br /> this.appendFlagBegin(tag);<br /> if(json[tag].constructor==Object){<br /> this._toXml(json[tag]);<br /> }<br /> else if(json[tag].constructor==String){<br /> this.appendText(json[tag]);<br /> }<br /> this.appendFlagEnd(tag);<br /> }<br /> }<br />};