FlexList对XMLListCollection子元素的排序

时间:2009-08-13 13:42:39

标签: xml flex list sorting collections

在Flex webapp中,是否有一种简单的方法可以根据子元素的属性对XML元素的子元素进行排序?示例如下:

的XMLListCollection:

  

<a anotherProp="ABCDE">
    <e prop="AB">1</element>
   <e prop="BC">2</element>
   </a>
   <a anotherProp="FGEH">
    <e prop="HF">3</element>
    <e prop="AD">4</element>
    <e prop="AC">5</element>
   </a>

我想根据其“prop”属性分别对每个<e>元素中的<a>元素进行排序。我生成包含<a>元素的数组的代码如下:

for each(var node:XML in initialInput:XMLListCollection){
  if(node.localName()=="a"){
    //I was hoping to be able to sort the <e> children of the node variable here
    xmlListCollectionVar.addItem(node);
  }
}

最后,我希望<a>保持其定义的顺序,但他们的<e>个孩子将根据“prop”属性进行排序。到目前为止,如果我尝试:

  

node.children()。排序= someSortVar

其中someSortVar的字段设置为:

  

SortFields( “E。@丙”,...)

我得到一个关于null值的异常。有什么方法可以将子列表转换为XMLListCollection,对其进行排序并将其集成回节点变量?感谢您的回复。

3 个答案:

答案 0 :(得分:1)

你可以使用compareFunction在数组上使用sort函数。

  

... args - 指定a的参数   比较功能和一个或多个   决定行为的价值观   那种。此方法使用语法   和参数顺序   的的Array.sort(的compareFunction,   带参数的sortOptions)   定义如下:

     

compareFunction - 比较   用于确定排序的函数   数组中元素的顺序。这个   参数是可选的。一个对比   函数应该带两个参数   相比。鉴于元素A和B,   compareFunction的结果可以有   以下三个值之一:   -1,如果A应出现在排序序列0中的B之前,如果A等于B 1,则if   A应该出现在排序后的B之后   sequence sortOptions - 一个或多个   数字或定义的常数,   由|分隔(按位OR)   运算符,改变行为   默认排序。这个   参数是可选的。下列   sortOptions可接受的值:   1或Array.CASEINSENSITIVE 2或   Array.DESCENDING 4或Array.UNIQUESORT   8或Array.RETURNINDEXEDARRAY 16或   Array.NUMERIC有关更多信息,   请参阅Array.sortOn()方法。

答案 1 :(得分:0)

在Adobe论坛上找到合适的代码实现 - 抱歉不要先找那里。

http://forums.adobe.com/message/72521#72521

答案 2 :(得分:0)

我想出了两个解决方案:第一个涉及将XMLList转换为数组并对数组进行排序:

  for each (var a:XML in elt..a)
  {
    var children:Array = toArray(a.children());
    children.sortOn("@prop");
    a.setChildren(new XMLList());
    for each (var c:XML in children)
    {
      a.appendChild(c);
    }
  }

第二个涉及使用XMLListCollection的排序属性,但我相信&lt; a&gt;孩子是XMLList,而不是XMLListCollection

  var sort:Sort = new Sort()
  sort.fields = [new SortField("@prop")];
  for each (var a:XML in xml..a)
  {
    var xcoll:XMLListCollection = new XMLListCollection(a.children());
    xcoll.sort = sort;
    xcoll.refresh();
    a.setChildren(xcoll.copy());
  }