在数据传输实现中,可能需要考虑功能性、兼容性,以及其他性能和方向(发给服务器或从服务器接收)。在考虑数据格式时,唯一需要关注的问题就是速度。
没有哪种数据格式会始终比其他格式更好。根据传送数据的类型、在页面上的使用目的不同,某种格式数据可能下载更快,另一种格式可能解析更快。
与其他格式相比,XML格式数据极其冗长。因为每个离散的数据片断需要大量XML结构,所以有效数据的比例非常低。XML语法还有些轻微模糊。
在一般情况下,解析XML要占用JavaScript程序员相当一部分精力。除了要提前知道详细结构之外,还必须确切地知道如何解开这个结构,然后精心地将它们写入JavaScript对象中。下面的代码表示如何将特定XML报文解析到对象中。
function parseXML(responseXML){
var users=;
var userNodes=responseXML.getElementsByTagName_r('users');
var node,usernameNodes,usernameNode,username,realnameNodes,realnameNode,realname,emailNodes,emailNode,email;
for(var i=0,len=userNodes.length;i<len;i++){
node=userNodes[i];
username=realname=email='';
usernameNodes=node.getElementsByTagName_r('username');
if(usernameNodes&&usernameNodes[0]){
usernameNode=usernameNodes[0];
username=(usernameNodes.firstChild)?usernameNodes.firstChild.nodeValue
:'';
}
realnameNodes=node.getElementsByTagName_r('realname');
if(realnameNodes&&realnameNodes[0]){
realnameNode=realnameNodes[0];
realname=(realnameNodes.firstChild)?realnameNodes.firstChild.nodeValue
:'';
}
emailNodes=node.getElementsByTagName_r('email');
if(emailNodes&&emailNodes[0]){
emailNode=emailNodes[0];
email=(emailNodes.firstChild)?emailNodes.firstChild.nodeValue:'';
}
users[i]={
id:node.getAttribute('id'),
username:username,
realname:realname,
email:email
};
}
return users;
}
在上面代码中,JavaScript引擎在读值之前,需要检查每个标签以保证该标签存在。这在很大程度上依赖于XML的结构。一个更有效的方式是将每个值都存储为<user>标签的属性,数据相同而文件尺寸却更小。
<?xml version="1.0"encoding='UTF-8'?>
<users total="4">
<userusername="alice"realname="Alice Smith"email="[email protected]"/>
<userusername="bob"realname="Bob Jones"email="[email protected]"/>
<userusername="carol"realname="Carol Williams"email="[email protected]"/>
<userusername="dave"realname="Dave Johnson"email="[email protected]"/>
</users>
解析简化版XML数据要容易得多:
function parseXML(responseXML){
var users=;
var userNodes=responseXML.getElementsByTagName_r('users');
for(var i=0,len=userNodes.length;i<len;i++){
users[i]={
id:userNodes[i].getAttribute('id'),
username:userNodes[i].getAttribute('username'),
realname:userNodes[i].getAttribute('realname'),
email:userNodes[i].getAttribute('email')
};
}
return users;
}
XPath在解析XML文档时比getElementsByTagName快得多。需要注意的是,由于XPath并未得到广泛支持,所以必须使用DOM遍历方法编写备用代码。现在,DOM级别为3的XPath已经被Firefox、Safari、Chrome和Opera浏览器支持,IE 8提供一个类似的接口。