讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議143:避免使用XML格式進行通信 >

建議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提供一個類似的接口。