首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议143:避免使用XML格式进行通信

关灯直达底部

在数据传输实现中,可能需要考虑功能性、兼容性,以及其他性能和方向(发给服务器或从服务器接收)。在考虑数据格式时,唯一需要关注的问题就是速度。

没有哪种数据格式会始终比其他格式更好。根据传送数据的类型、在页面上的使用目的不同,某种格式数据可能下载更快,另一种格式可能解析更快。

与其他格式相比,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提供一个类似的接口。