初学JS请大神指教。。
就是需要XML和JS对象相互转换
搞了半天终于搞了个似乎还能运行的代码,不过感觉质量有点渣。。
首先要一个全局变量pXml记录位置,本来想作为函数参数传递,但JS普通类型又不能传引用,所以还是要用全局变量才行,大神怎么可以不用这个全局变量啊。。
然后整体代码都显得比较臃肿,怎么可以精简一点啊。。对象转XML代码还好,XML转对象真的十分纠结啊。。
各位大神帮帮忙。。小弟分真的不多。。<script>//XML 转 对象
var pXml = 0;
function getObj(xml,preTag)
{
var left = -1,right = -1;
var tag = "",content = "";
var obj = new Object();
while (pXml < xml.length)
{
left = xml.indexOf("<",pXml);
right = xml.indexOf(">",pXml);
if ((left | right != -1) && (left < right))
{
tag = xml.substring(left + 1,right);
if (tag[0] == "/")
{
if (tag != "/" + preTag)
{
//匹配错误
pXml = right + 1;
return;
}
if (obj.length)
{
pXml = right + 1;
return obj;
}
content = xml.substring(pXml,left);
pXml = right + 1;
return content;
}else
{
pXml = right + 1;
obj.length = ++obj.length || 1;
obj[tag] = getObj(xml,tag);
}
}else
{
break;
}
}
return obj;
}function xmlToObj(xml)
{
pXml = 0;
return getObj(xml.substring(xml.indexOf(">") + 1,xml.lastIndexOf("<")));
}//对象 转 XML
function getXml(obj)
{
var xml = "";
for (var attr in obj)
{
if (obj[attr] instanceof Object)
{
xml += "<" +  attr + ">";
xml += getXml(obj[attr]);
xml += "</" + attr + ">";
}else
{
xml += "<" +  attr + ">";
xml += obj[attr];
xml += "</" + attr + ">";
}
}

return xml;
}function objToXml(obj)
{
return "<root>" + getXml(obj) + "</root>";
}//测试数据
var obj1 = {
"First" : "Something",
"Second" : {
"First" : "Something more",
"Data" : "Some data"
},
"Third" : "Balabala"
};//正常情况
var xml = objToXml(obj1)
var obj2 = xmlToObj(xml);//匹配错误情况
xml = "<root><first>123</first><second><err>Nothing</error><haha>Something</haha></second></root>";
var obj3 = xmlToObj(xml);
</script>
JavaScriptXML对象

解决方案 »

  1.   


    var xml = "<root><first>123</first><second><error>Nothing</error><haha>Something</haha></second></root>";
    var parseXML2JSON = {
    parse : function(xmlStr){
    var root = document.createElement('XMLROOT');
    root.innerHTML = xmlStr;
    return this.parse2json(root);
    },
    parse2json : function(node){
    var result = {};
    if(node.childNodes.length > 0){
    for(var i = 0 ; i < node.childNodes.length ; ++i){
    if(node.childNodes[i].nodeType==1){
    result[node.childNodes[i].nodeName.toLowerCase()] = this.parse2json(node.childNodes[i]);
    }else if(node.childNodes[i].nodeType==3){
    return node.childNodes[i].nodeValue;
    }

    }
    }
    return result;
    }
    };
    var jsonData = parseXML2JSON.parse(xml);
    alert(JSON.stringify(jsonData));
      

  2.   

    昨天晚上太晚了,没有写完,今天把json2xml补上。var xml = "<root><first>123</first><second><error>Nothing</error><haha>Something</haha></second></root>";
    var parseXMLJSON = {
        parse2json: function(xmlStr){
            var root = document.createElement('XMLROOT');
            root.innerHTML = xmlStr;        
            return this.parse(root);
        } ,
        parse: function(node){
            var result = {};                  
            for(var i = 0 ; i < node.childNodes.length ; ++i){
                if(node.childNodes[i].nodeType==1){
                    result[node.childNodes[i].nodeName.toLowerCase()] = this.parse(node.childNodes[i]);
                }else if(node.childNodes[i].nodeType==3){                                        
                    return node.childNodes[i].nodeValue;
                }                 
            }
            return result;
        } ,
        parse2xml: function(data){
            var xmldata = '';
            for(var i in data){
                xmldata+= '<'+i+'>';
                if(typeof data[i]=='object'){
                    xmldata+= this.parse2xml(data[i]);
                }else{
                    xmldata+= data[i];
                }
                xmldata+= '</'+i+'>';
            }
            return xmldata;
        }
    };
    var jsonData = parseXMLJSON.parse2json(xml);
    var xmlData = parseXMLJSON.parse2xml(jsonData);
    alert('xml to json: ' + JSON.stringify(jsonData));
    alert('json to xml: ' + xmlData);