Last active
August 29, 2015 13:57
-
-
Save blpraveen/9761489 to your computer and use it in GitHub Desktop.
Jquery json2xml convert json object into xml
This file contains 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
$.extend({ | |
// converts xml documents and xml text to json object | |
json2xml: function(jsonObj,config) { | |
config = config || {}; | |
initConfigDefaults(); | |
var out = parseJSONObject(jsonObj); | |
return out; | |
function initConfigDefaults() { | |
if(config.escapeMode === undefined) { | |
config.escapeMode = true; | |
} | |
config.attributePrefix = config.attributePrefix || "_"; | |
config.arrayAccessForm = config.arrayAccessForm || "none"; | |
config.emptyNodeForm = config.emptyNodeForm || "text"; | |
if(config.enableToStringFunc === undefined) { | |
config.enableToStringFunc = true; | |
} | |
config.arrayAccessFormPaths = config.arrayAccessFormPaths || []; | |
if(config.skipEmptyTextNodesForObj === undefined) { | |
config.skipEmptyTextNodesForObj = true; | |
} | |
if(config.stripWhitespaces === undefined) { | |
config.stripWhitespaces = true; | |
} | |
config.datetimeAccessFormPaths = config.datetimeAccessFormPaths || []; | |
} | |
function startTag(jsonObj, element, attrList, closed) { | |
var resultStr = "<"+ ( (jsonObj!=null && jsonObj.__prefix!=null)? (jsonObj.__prefix+":"):"") + element; | |
if(attrList!=null) { | |
for(var aidx = 0; aidx < attrList.length; aidx++) { | |
var attrName = attrList[aidx]; | |
var attrVal = jsonObj[attrName]; | |
if(config.escapeMode) | |
attrVal=escapeXmlChars(attrVal); | |
resultStr+=" "+attrName.substr(config.attributePrefix.length)+"='"+attrVal+"'"; | |
} | |
} | |
if(!closed) | |
resultStr+=">"; | |
else | |
resultStr+="/>"; | |
return resultStr; | |
} | |
function endTag(jsonObj,elementName) { | |
return "</"+ (jsonObj.__prefix!=null? (jsonObj.__prefix+":"):"")+elementName+">"; | |
} | |
function endsWith(str, suffix) { | |
return str.indexOf(suffix, str.length - suffix.length) !== -1; | |
} | |
function getNodePrefix(node) { | |
return node.prefix; | |
} | |
function escapeXmlChars(str) { | |
if(typeof(str) == "string") | |
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g, '/'); | |
else | |
return str; | |
} | |
function unescapeXmlChars(str) { | |
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'").replace(///g, '\/'); | |
} | |
function jsonXmlSpecialElem ( jsonObj, jsonObjField ) { | |
if((config.arrayAccessForm=="property" && endsWith(jsonObjField.toString(),("_asArray"))) | |
|| jsonObjField.toString().indexOf(config.attributePrefix)==0 | |
|| jsonObjField.toString().indexOf("__")==0 | |
|| (jsonObj[jsonObjField] instanceof Function) ) | |
return true; | |
else | |
return false; | |
} | |
function jsonXmlElemCount ( jsonObj ) { | |
var elementsCnt = 0; | |
if(jsonObj instanceof Object ) { | |
for( var it in jsonObj ) { | |
if(jsonXmlSpecialElem ( jsonObj, it) ) | |
continue; | |
elementsCnt++; | |
} | |
} | |
return elementsCnt; | |
} | |
function parseJSONObject ( jsonObj ) { | |
var result = ""; | |
var elementsCnt = jsonXmlElemCount ( jsonObj ); | |
if(elementsCnt > 0) { | |
for( var it in jsonObj ) { | |
if(jsonXmlSpecialElem ( jsonObj, it) ) | |
continue; | |
var subObj = jsonObj[it]; | |
var attrList = parseJSONAttributes( subObj ) | |
if(subObj == null || subObj == undefined) { | |
result+=startTag(subObj, it, attrList, true); | |
} | |
else | |
if(subObj instanceof Object) { | |
if(subObj instanceof Array) { | |
result+=parseJSONArray( subObj, it, attrList ); | |
} | |
else if(subObj instanceof Date) { | |
result+=startTag(subObj, it, attrList, false); | |
result+=subObj.toISOString(); | |
result+=endTag(subObj,it); | |
} | |
else { | |
var subObjElementsCnt = jsonXmlElemCount ( subObj ); | |
if(subObjElementsCnt > 0 || subObj.__text!=null || subObj.__cdata!=null) { | |
result+=startTag(subObj, it, attrList, false); | |
result+=parseJSONObject(subObj); | |
result+=endTag(subObj,it); | |
} | |
else { | |
result+=startTag(subObj, it, attrList, true); | |
} | |
} | |
} | |
else { | |
result+=startTag(subObj, it, attrList, false); | |
result+=parseJSONTextObject(subObj); | |
result+=endTag(subObj,it); | |
} | |
} | |
} | |
result+=parseJSONTextObject(jsonObj); | |
return result; | |
} | |
function parseJSONAttributes ( jsonObj ) { | |
var attrList = []; | |
if(jsonObj instanceof Object ) { | |
for( var ait in jsonObj ) { | |
if(ait.toString().indexOf("__")== -1 && ait.toString().indexOf(config.attributePrefix)==0) { | |
attrList.push(ait); | |
} | |
} | |
} | |
return attrList; | |
} | |
function parseJSONTextAttrs ( jsonTxtObj ) { | |
var result =""; | |
if(jsonTxtObj.__cdata!=null) { | |
result+="<![CDATA["+jsonTxtObj.__cdata+"]]>"; | |
} | |
if(jsonTxtObj.__text!=null) { | |
if(config.escapeMode) | |
result+=escapeXmlChars(jsonTxtObj.__text); | |
else | |
result+=jsonTxtObj.__text; | |
} | |
return result; | |
} | |
function parseJSONTextObject ( jsonTxtObj ) { | |
var result =""; | |
if( jsonTxtObj instanceof Object ) { | |
result+=parseJSONTextAttrs ( jsonTxtObj ); | |
} | |
else | |
if(jsonTxtObj!=null) { | |
if(config.escapeMode) | |
result+=escapeXmlChars(jsonTxtObj); | |
else | |
result+=jsonTxtObj; | |
} | |
return result; | |
} | |
function parseJSONArray ( jsonArrRoot, jsonArrObj, attrList ) { | |
var result = ""; | |
if(jsonArrRoot.length == 0) { | |
result+=startTag(jsonArrRoot, jsonArrObj, attrList, true); | |
} | |
else { | |
for(var arIdx = 0; arIdx < jsonArrRoot.length; arIdx++) { | |
result+=startTag(jsonArrRoot[arIdx], jsonArrObj, parseJSONAttributes(jsonArrRoot[arIdx]), false); | |
result+=parseJSONObject(jsonArrRoot[arIdx]); | |
result+=endTag(jsonArrRoot[arIdx],jsonArrObj); | |
} | |
} | |
return result; | |
} | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment