Last active
August 29, 2015 13:57
-
-
Save manxisuo/9746651 to your computer and use it in GitHub Desktop.
Convert JSON to XML & Convert XML to JSON (JSON和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
/* | |
使用方法: | |
1. 将XML转为JS对象: | |
JXParser.xml2Json(xml); | |
2. 将JS对象或JSON字符串转为XML: | |
JXParser.xml2Json(xml); | |
*/ | |
(function(window){ | |
/** | |
* Convert XML to a JS Object (将XML字符串转为JS对象) | |
* | |
* @param xmlContent the XML String (XML字符串) | |
* @return JS Object | |
*/ | |
function xml2Json(xmlContent) { | |
var rootNode = loadXML(xmlContent).childNodes[0]; | |
var jsonObj = {}; | |
handleNode(rootNode, jsonObj); | |
return jsonObj; | |
} | |
/** | |
* Convert JSON(JS Object) to XML (将JSON字符串或JS对象转为XML) | |
* | |
* @param json a JSON string or an object (JSON字符串或一个JS对象) | |
* @return XML | |
*/ | |
function json2Xml(json) { | |
if (null == json) return ''; | |
var obj; | |
if ('string' == typeof json) { | |
obj = JSON.parse(json); | |
} | |
else { | |
obj = json; | |
} | |
var xml = convertObject(obj); | |
return xml; | |
} | |
/** | |
* 处理XML DOM中的某个节点。 | |
* | |
* @param node DOM书中的某个节点对象。 | |
* @param context 转化为JS对象后,该节点对应的属性所属的对象。 | |
*/ | |
function handleNode(node, context) { | |
var nodeName = node.tagName; | |
// 文本节点。(递归结束) | |
if (1 == node.childNodes.length && | |
3 == node.childNodes[0].nodeType) { | |
handleArray(context, nodeName, node.textContent); | |
} | |
// 非文本节点。 | |
else { | |
var curNodeValue = {}; | |
handleArray(context, nodeName, curNodeValue); | |
var children = node.childNodes; | |
for (var i = 0; i < children.length; i++) { | |
handleNode(children[i], curNodeValue); | |
} | |
} | |
} | |
function handleArray(context, nodeName, curNodeValue) { | |
// 如果节点是数组节点,并且之前已经放过数组项。 | |
if (nodeName in context) { | |
if (!(context[nodeName] instanceof Array)) { | |
context[nodeName] = [context[nodeName]]; | |
} | |
context[nodeName].push(curNodeValue); | |
} | |
// 如果节点是非数组节点,或者之前没有放过数组项 | |
else { | |
context[nodeName] = curNodeValue; | |
} | |
} | |
/** | |
* 将XML字符串转为XML DOM对象。 | |
* | |
* @param data 待转的XML字符串。 | |
*/ | |
function loadXML(data) { | |
var xml; | |
if (window.DOMParser) { | |
xml = new DOMParser().parseFromString(data, 'text/xml'); | |
} | |
else { | |
xml = new ActiveXObject(Microsoft.XMLDOM); | |
xml.async = 'false'; | |
xml.loadXML(data); | |
} | |
// 用jQuery解析 | |
// var xml = $.parseXML(xmlContent); | |
return xml; | |
} | |
/** | |
* 处理JSON中的某个属性值。 | |
* | |
* @param obj JSON中的某个属性值。 | |
*/ | |
function convertObject(obj) { | |
var xmlContent = ''; | |
if (null != obj) { | |
if (typeof obj == 'object') { | |
for (var prop in obj) { | |
var value = obj[prop]; | |
if (value instanceof Array) { | |
for (var i in value) { | |
xmlContent += (startTag(prop) | |
+ convertObject(value[i]) | |
+ endTag(prop)); | |
} | |
} | |
else { | |
xmlContent += (startTag(prop) | |
+ convertObject(value) | |
+ endTag(prop)); | |
} | |
} | |
} | |
else { | |
xmlContent = obj; | |
} | |
} | |
else { | |
xmlContent = null; | |
} | |
return xmlContent; | |
} | |
function startTag(tagName) { | |
return '<' + tagName + '>'; | |
} | |
function endTag(tagName) { | |
return '</' + tagName + '>'; | |
} | |
var JXParser = {}; | |
JXParser.xml2Json = xml2Json; | |
JXParser.json2Xml = json2Xml; | |
window.JXParser = JXParser; | |
})(window); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment