2010-09-22 27 views
0

您可以看看我的JavaScript,並讓我知道是否有更有效的方式來編寫循環訪問我的XML?更高效的在JavaScript中循環顯示XML數據的方法?

我的JavaScript代碼如下所示:

<script type="text/javascript"> 
function loadXMLDoc(dname) 
{ 
    xhttp=new XMLHttpRequest(); 
    xhttp.open("GET",dname,false); 
    xhttp.send(); 
    return xhttp.responseXML; 
} 

var xmlDoc=loadXMLDoc("building.txt"); 

x=xmlDoc.getElementsByTagName('Building'); 

for (i=0;i<x.length;i++) 
{ 
    txt=xmlDoc.getElementsByTagName('Building')[i].getAttribute('Name'); 

    document.write(txt + "<BR>");  

    y=x[i].getElementsByTagName('Tenant'); 

    for (j=0;j<y.length;j++) 
    { 
     txt1=x[i].getElementsByTagName('Tenant')[j].getAttribute('DISPLAYNAME'); 
     document.write("> " + txt1 + "<BR>"); 
    } 

    document.write("<HR>"); 
} 

我的XML數據看起來是這樣的 - 我粘貼它引擎收錄... http://pastebin.com/nhMHjCjP

回答

0
  1. 反向循環不會在這裏工作是因爲順序會不同(如果這對你很重要),但是你可以通過緩存變量來提高循環性能:

    for (i=0; i<x.length; i++) -> for (var i=0,n=x.length; i<n; i++) 
    for (j=0; j<y.length; j++) -> for (var j=0,m=y.length; j<m; j++) 
    
  2. 而不是調用多個獨立的document.write s,它建立字符串,只是調用一個更快。

  3. 如果這是一個HTML頁面,最好不要調用它,document.write有些陳舊,最好是使用元素的.innerHTML或以另一種方式附加它。
0

爲以

var i = length; while(i--){...}; 

我相信比爲在JavaScript

+0

正如我所說,這將返回一個不同於原始XML的順序 – vol7ron 2010-09-22 06:21:18

0

在這裏最慢的功能可能是xmlDoc.getElementsByTagName調用更快太大的變化。爲每個正在查找的標記調用xmlDoc.getElementsByTagName,而不是兩個。然後可以在for循環中使用它並訪問該元素。因此:使用x您第二次提到xmlDoc.getElementsByTagName('Building')並使用y您第二次提到x[i].getElementsByTagName('Tenant')這會給你最大的加速。

另一項更改將簡化您的代碼,並允許您更輕鬆地進行優化(但本身可能不會太快):創建一個數據結構來保存數據,而不是隨時爲文檔構建DOM元素。這也將使調試更容易。稍後,它將幫助您隔離性能問題 - 即使使用分析器,也很難判斷解析XML文檔是否緩慢或構建新的DOM節點。

因此:

var buildings = []; // add this 
    for(...) 
    txt=x[i].getAttribute('Name'); 
    // SKIP: document.write(txt + "<BR>");  

    y=x[i].getElementsByTagName('Tenant'); 
    var tenants = []; 
    for (j=0;j<y.length;j++) 
    { 
     txt1=y[j].getAttribute('DISPLAYNAME'); 
     tenants.push(txt1); // instead of: document.write("> " + txt1 + "<BR>"); 
    } 
    buildings.push({ name: txt, tenants: tenants }); 

現在你有乾淨 「進口」 的代碼。你有一個很好的數據結構來生成DOM節點。

1

優化的版本,使用cacheing:

 
function loadXMLDoc(dname) 
{ 
    xhttp=new XMLHttpRequest(); 
    xhttp.open("GET",dname,false); 
    xhttp.send(); 
    return xhttp.responseXML; 
} 
var xmlDoc=loadXMLDoc("building.txt"); 
var buildingTags = xmlDoc.getElementsByTagName('Building'); 
for (i=0,l=buildingTags.length;i<l;i++){ 
    txt=buildingTags[i].getAttribute('Name'); 
    document.write(txt + "<BR>");  
    var y=buildingTags[i].getElementsByTagName('Tenant'); 
    for (j=0,l1=y.length,j<l1;j++){ 
     txt1=y[j].getAttribute('DISPLAYNAME'); 
     document.write(" > " + txt1 + "<BR>"); 
    } 
    document.write("<HR>"); 
} 

0

看一看我的答案我貼到我自己的問題。

https://stackoverflow.com/a/17057095/2439211

我成功創建了一個for循環裏面,一個如果else語句將搜索XML並將結果顯示在表格中。如果未找到任何結果,則會顯示一條消息,指出找不到聯繫人。