【问题标题】:Flex Newbie XMLList question - Sorting XML and XMLListFlex 新手 XMLList 问题 - 排序 XML 和 XMLList
【发布时间】:2009-12-08 21:27:33
【问题描述】:

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

MyXMLListCol = new XMLListCollection(MyXMLList);

我认为这种情况下的 XMLListCollection 没有对 XMLList 的任何引用,因此对其进行排序会使我的 XMLList 未排序,这是正确的吗?

如何直接对 XMLList 进行排序?

谢谢 〜迈克

【问题讨论】:

  • 你为什么要这样做?几乎所有可能需要排序的 xmllist 应用程序都是通过 xmllistcollection 完成的
  • XMLList 对象需要排序而 XMLListCollection 可以轻松为您工作的任何具体原因?
  • 我无法用我拥有的 600 个字符来描述我对此的需求。我的应用程序正在导入和维护一个大型 XML 变量,如果我开始修改和修改该变量的节点克隆,则很难使原始变量保持最新。我希望能够直接对变量进行排序操作。

标签: apache-flex flex3


【解决方案1】:

所以我终于对搜索词进行了足够多的修改,我实际上对此做出了回答。 使用我从这里得到的技术: 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 和 XMLList 进行排序的能力非常重要

【讨论】:

    【解决方案2】:

    虽然没有与 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 更容易且错误更少。此外,如果其他人正在阅读您的代码,他们会发现它更容易理解。请帮自己一个忙,避免重新发明轮子。

    【讨论】:

    • 这是一个很棒的代码 sn-p。简单明了。谢谢。
    • 经过几次尝试,我放弃了让这段代码正常工作,它似乎进入了一个无限循环(或者至少是一个非常长的循环)
    • 诚然,对于 XMLLists,如果长度过长,这段代码将不会非常有效地工作。但是,您也许可以直接查看 SDK 并了解 XMLListCollection 是如何实现排序的。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2014-03-17
    相关资源
    最近更新 更多