在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,对其进行排序并将其集成回节点变量?感谢您的回复。
答案 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论坛上找到合适的代码实现 - 抱歉不要先找那里。
答案 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());
}