初学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对象
就是需要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对象
解决方案 »
- div如何想拉窗体一样的进行修改大小呀?
- 如何设置file field,使得它选定客户端的一幅固定图片,这样就免得客户重复选择了???
- [20分全给]如何对去掉字符串两边的“ ”
- replace(/(\d{6})(?=\d)(\d{8})(?=\d)/g,"$1 $2 ")用来分隔身份证
- 提取表单文本框月份,求解?
- 谁能给我一个包含全国省市甚至更深层次的xml数据文件
- 正则一问
- 进来可以拿分的问题。(在线给分)
- 我想让鼠标经过一个链接,在另外表格的图片会改变,怎么做?
- 页面问题,神牛进!!!!!!!!
- 急急急 很简单的函数调用问题 求大家来指导 JS新手
- jquery中$this和$(this)的作用和区别
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));
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);