2011-12-14 82 views
0

考慮這個XML片斷,以找到不同的值:使用E4X的XML列表

<book id="5" /> 
<book id="15" /> 
<book id="5" /> 
<book id="25" /> 
<book id="35" /> 
<book id="5" /> 

我如何可以撰寫E4X聲明/查詢來獲得在id屬性的唯一值的列表?我在JavaScript非瀏覽器上下文中使用E4X。

5 
15 
25 
35 

有什麼樣的,這將有助於一個distinct()groupby()方法?如果不是,這怎麼可能完成?

回答

2

沒有獨特的或groupby的方法。但是,E4X允許您快速創建值非唯一值的XMLList。

var xmlSnippet = <stuff><book id="5"/> 
         <book id="15"/> 
         <book id="5"/> 
         <book id="25"/> 
         <book id="35"/> 
         <book id="5"/> 
        </stuff>; 
var attributes = xmlSnippet['book'].attribute("id"); 

爲了使它具有唯一性,您可以接受XMLList,遍歷它,並將每個元素作爲關鍵值存儲在對象中。

var uniqueAttributes = new Object(); 

for each (var a in attributes) 
{ 
    uniqueAttributes[a] = null; 
} 

向(在不是爲每個)訪問這些值,使用用於循環遍歷它們

for (var u in uniqueAttributes) 
{ 
// do something with u 
} 
1

這假定有問題的屬性值不包含管道「|」,字符。如果是這樣,那麼將底部的管道字符更改爲其他不在值中的其他字符。這些變量是針對JIT執行的靜態類型。希望這可以滿足你的需要。

var idvalues = function (x) { //x = node name 
    var a = document.getElementsByTagName(x), 
     b, 
     c = [], 
     d, 
     e; 
    for (b = a.length - 1; b > -1; b -= 1) { // gather all the id values into an array 
     c.push(a[b].getAttribute("id")); 
    } 
    for (b = c.length - 1; b > -1; b -= 1) { 
     if (c[b] !== "") { 
      for (d = b - 1; d > -1; d -=1) { 
       if (c[b] === c[d]) { 
        c[d] = ""; 
       } 
      } 
     } 
    } 
    e = c.join("|"); 
    c = e.split("|"); 
    return c; 
};