Skip to content

Instantly share code, notes, and snippets.

@manxisuo
Last active August 29, 2015 13:57
Show Gist options
  • Save manxisuo/9746651 to your computer and use it in GitHub Desktop.
Save manxisuo/9746651 to your computer and use it in GitHub Desktop.
Convert JSON to XML & Convert XML to JSON (JSON和XML相互转化)
/*
使用方法:
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