Flex Newbie XMLList问题 - 对XML和XMLList进行排序

时间:2009-12-08 21:27:34

标签: flex flex3

是否可以对XMLList进行排序?我可以在其上找到的所有示例都创建了一个新的XMLListCollection:

MyXMLListCol = new XMLListCollection(MyXMLList);

我认为在这种情况下XMLListCollection没有对XMLList的任何引用,所以对它进行排序会使我的XMLList不被排序,这是正确的吗?

如何直接对XMLList进行排序?

由于 〜麦克

2 个答案:

答案 0 :(得分:2)

所以我终于改变了我的搜索词,我实际上已经回答了这个问题。 使用我从这里得到的技术: http://freerpad.blogspot.com/2007/07/more-hierarchical-sorting-e4x-xml-for.html

我能够想出这个:

public function sortXMLListByAttribute(parentNode:XML,xList:XMLList,attr:String):void{
//attr values must be ints
var xListItems:int = xList.length();
if(xListItems !=0){
    var sortingArray:Array = new Array();
    var sortAttr:Number = new Number();
    for each (var item:XML in xList){
        sortAttr = Number(item.attribute(attr));
        if(sortingArray.indexOf(sortAttr)==-1){
            sortingArray.push(sortAttr);
        }
        //piggy back the removal, just have to remove all of one localName without touching items of other localNames
        delete parentNode.child(item.localName())[0];
    }
    if( sortingArray.length > 1 ) {
        sortingArray.sort(Array.NUMERIC);
    }

    var sortedList:XMLList = new XMLList();
    for each(var sortedAttr:Number in sortingArray){
        for each (var item2:XML in xList){
            var tempVar:Number = Number(item2.attribute(attr));
            if(tempVar == sortedAttr){
                sortedList += item2
            }
        }
    }
    for each(var item3:XML in sortedList){
        parentNode.appendChild(item3);
    }
}
}

工作得非常快,并保持原始XML变量的更新。我知道我可能正在重新发明轮子只是为了不使用XMLListCollection,但我认为对XML和XMLLists进行排序的能力非常重要

答案 1 :(得分:0)

虽然没有与Array.sortOn函数等效的本机,但实现自己的排序算法还是微不足道的:

// Bubble sort.

// always initialize variables -- it save memory.
var ordered:Boolean = false;
var l:int = xmlList.length();
var i:int = 0;
var curr:XML = null;
var plus:XML = null;
while( !ordered )
{
    // Assume that the order is correct
    ordered = true;
    for( i = 0; i < l; i++ )
    {
        curr = xmlList[ i ];
        plus = xmlList[ i + 1 ];    

        // If the order is incorrect, swap and set ordered to false.
        if( Number( curr.@order ) < Number( plus.@order ) )
        {
            xmlList[ i ]     = plus;
            xmlList[ i + 1 ] = curr;
            ordered = false;
        }
    }
}

但是,实际上,使用XMLListCollection要容易得多且错误少。此外,如果其他人正在阅读您的代码,他们会发现它更容易理解。请帮个忙,避免重新发明轮子。