2011-09-22 27 views
0

在ActionScript 3,有一個方法來在文檔順序的XMLList(如在the XDM spec定義的節點(XML類型的實例)進行排序;「非正式地,文檔順序是在哪些節點的順序出現在文檔的XML序列化中「)?或者,有沒有辦法比較兩個節點的文檔位置?排序AS3的XMLList

這裏是我的意思一個小例子。在真實情況下,該列表是由一個更復雜的過程構建的,可能有數百個節點。

var x:XML = <a><b/><b/></a>; 
var b0:XML = x.b[0]; 
var b1:XML = x.b[1]; 
var l:XMLList = new XMLList(); 
l += b1; 
l += b0; 
var sl:XMLList = documentSortFunction(l); 
assertTrue(sl[0] === b0); 

我不知道我有很大的希望在這裏,因爲它似乎ECMA-357(E4X)並沒有真正有文件的一個概念,更別說文檔順序。

+0

你有沒有使用XMLListCollection?它對內置的函數進行排序和過濾。 –

+0

感謝您的建議。我沒有看過它,因爲這不是GUI的東西。不過,我只是看了一下,我沒有看到按文檔順序排序的方法。 –

+0

你是指按文件順序排序? –

回答

0

嗯,這裏是我想出了答案的草圖。這還沒有經過太多測試,但我想我會在忘記之前記錄它。

的想法是實現一個函數,以產生一個節點,使得字符串的順序是一樣的節點的順序的字符串。

protected function generateSortID(n:XML):String 
{ 
    var ret:String = ''; 
    while (n != null && n.childIndex() > -1) 
    { 
     var s:String = '' + n.childIndex(); 
     ret = '0000000'.substring(s.length) + s + '!' + ret; 
     n = n.parent(); 
    } 
    return ret; 
} 

protected function compareNodePair(a:Array, b:Array):int 
{ 
    var ai:String = a[0]; 
    var bi:String = b[0]; 
    if (ai < bi) 
     return -1; 
    else if (ai > bi) 
     return 1; 
    else 
     return 0; 
} 

// all nodes in input list must be part of the same document. 
protected function documentSortFunction(l:XMLList):XMLList 
{ 
    var augArr:Array = []; 
    for (var il:String in l) 
     augArr.push([generateSortID(l[il]), l[il]]); 
    augArr.sort(compareNodePair); 
    var ret:XMLList = new XMLList(); 
    for (var ia:String in augArr) 
     ret += augArr[ia][1]; 
    return ret; 
}