在數據傳輸實現中,可能需要考慮功能性、兼容性,以及其他性能和方向(發給服務器或從服務器接收)。在考慮數據格式時,唯一需要關注的問題就是速度。
沒有哪種數據格式會始終比其他格式更好。根據傳送數據的類型、在頁面上的使用目的不同,某種格式數據可能下載更快,另一種格式可能解析更快。
與其他格式相比,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提供一個類似的接口。