将回来的XML数据转化为JSON格式

将返回的XML数据转化为JSON格式

代码如下:

/**
 * 转换xml为对象形式
 * @return {Object}
 * @param {XMLHttpRequest} elXML
 */
$.fn.toObject = function (){
    if (this==null) return null;
    var retObj = new Object;
    buildObjectNode(retObj,/*jQuery*/this.get(0));
    return $(retObj);
    function buildObjectNode(cycleOBJ,/*Element*/elNode){
        /*NamedNodeMap*/
        var nodeAttr=elNode.attributes;
        if(nodeAttr != null){
            if (nodeAttr.length&&cycleOBJ==null) cycleOBJ=new Object; 
            for(var i=0;i<nodeAttr.length;i++){
                cycleOBJ[nodeAttr[i].name]=nodeAttr[i].value;
            }
        }
        var nodeText="text";
        if (elNode.text==null) nodeText="textContent";
        /*NodeList*/
        var nodeChilds=elNode.childNodes;
        if(nodeChilds!=null){
            if (nodeChilds.length&&cycleOBJ==null) cycleOBJ=new Object; 
            for(var i=0;i<nodeChilds.length;i++){
                if (nodeChilds[i].tagName!=null){
                    if (nodeChilds[i].childNodes[0]!=null&&nodeChilds[i].childNodes.length<=1&&(nodeChilds[i].childNodes[0].nodeType==3||nodeChilds[i].childNodes[0].nodeType==4)){
                        if (cycleOBJ[nodeChilds[i].tagName]==null){
                            cycleOBJ[nodeChilds[i].tagName]=nodeChilds[i][nodeText];
                        }else{
                            if (typeof(cycleOBJ[nodeChilds[i].tagName])=="object"&&cycleOBJ[nodeChilds[i].tagName].length){
                                cycleOBJ[nodeChilds[i].tagName][cycleOBJ[nodeChilds[i].tagName].length]=nodeChilds[i][nodeText];
                            }else{
                                cycleOBJ[nodeChilds[i].tagName]=[cycleOBJ[nodeChilds[i].tagName]];
                                cycleOBJ[nodeChilds[i].tagName][1]=nodeChilds[i][nodeText];
                            }
                        }
                    }else{
                        if (nodeChilds[i].childNodes.length){
                            if (cycleOBJ[nodeChilds[i].tagName]==null){
                                cycleOBJ[nodeChilds[i].tagName]=new Object;
                                buildObjectNode(cycleOBJ[nodeChilds[i].tagName],nodeChilds[i]);
                            }else{
                                if (cycleOBJ[nodeChilds[i].tagName].length){
                                    cycleOBJ[nodeChilds[i].tagName][cycleOBJ[nodeChilds[i].tagName].length]=new Object;
                                    buildObjectNode(cycleOBJ[nodeChilds[i].tagName][cycleOBJ[nodeChilds[i].tagName].length-1],nodeChilds[i]);
                                }else{
                                    cycleOBJ[nodeChilds[i].tagName]=[cycleOBJ[nodeChilds[i].tagName]];
                                    cycleOBJ[nodeChilds[i].tagName][1]=new Object;
                                    buildObjectNode(cycleOBJ[nodeChilds[i].tagName][1],nodeChilds[i]);
                                }
                            }
                        }else{
                            cycleOBJ[nodeChilds[i].tagName]=nodeChilds[i][nodeText];
                        }
                    }
                }
            }
        }
    }
}

/**
 * @return {Element}
 * @param {String} _url
 */
$.loadXML = function (_url ,_data){
    var ret;
    $.ajax({
    	data : _data ,
	    type:"post",
	    url:_url,
        async:false,
        dataType:"xml",
        success:function(xml){
            ret = xml;
        } ,
        error : function(){
        	Ext.MessageBox.show({
				 title: '提示',
				 msg: '操作失败!',
				 buttons: Ext.MessageBox.OK,
 				 icon: Ext.MessageBox.INFO
             }); 
        }
      });
    return ret.documentElement;
}

 

 

使用

var xml = $.loadXML(contextPath+'/dataItemManagerAction.do?method=query' ,{
			'typeId' : 'deptNo'
		} );
var obj = $(xml).toObject().get(0);
var record = "";
Ext.each(obj.DataItem, function(value,index,a){
	record += "<option value='"+value.id+"'>"+value.name+"</option>"
}) ;
$('#'+id).append(record);