Web客户端与服务器端传输对象,除了使用JSON之外,选择XML作为传输媒介也是比较常用的一种方法。但在JS脚本中,直接使用XML似乎有点麻烦,因此需要在JS对象与XML文档之间做一个简单转化。
为了兼容大部分对象定义,XML文档采用如下形式传输:
<objects>
<object>
<field>
<name>code</name>
<value>201301</value>
</field>
<field>
<value>张三</value>
</field>
<field>
<value>男</value>
<field>
</field>
<value>1990-01-01</value>
</field>
</objects>
这里object元素表示一个对象,对象中包含若干个field元素,每个field元素中的name与value分别表示该属性的名称和值。
XML转化为JS对象代码如下:
//将XML节点转化为数组对象<name><value>
function parseNodesAsArray(nodes){
var objs = new Array();
if(nodes == null) return objs;
for(var i = 0;i < nodes.length;i++){
if(nodes[i] == null) continue;
var nvnodes = nodes[i].selectNodes("field");
if(nvnodes == null || nvnodes.length == 0) continue;
var newObj = new Object();
for(var j = 0;j < nvnodes.length;j++){
if(nvnodes[j] == null) continue;
var nnode = nvnodes[j].selectSingleNode("name");
var vnode = nvnodes[j].selectSingleNode("value");
var fieldName = GetNodeValue(nnode);
var fieldValue = GetNodeValue(vnode);
if(fieldName == null || fieldName.length == 0) continue;
newObj[fieldName] = fieldValue;
}
objs[objs.length] = newObj;
}
return objs;
}
调用时传入参数为object元素集合,如:var objs = parseNodesAsArray(xml.selectNodes("/objects/object"));。
此外,GetNodeValue为另外一个获取属性的函数,如下:
var GetNodeValue = function(obj){
var str = "";
if(obj == null) return str;
if(window.ActiveXObject){ //IE
str = obj.text;
}
else{ //Mozilla, Firefox, etc.
try{
str = obj.childNodes[0].nodeValue;
}catch(ex){
str = "";
}
if(str == ""){
try{
str = obj.nodeValue;
}catch(ex){
str = "";
}
}
}
return str;
}