在Actionscript 3中,有没有办法按文档顺序对XMLList中的节点(XML类型的实例)进行排序(如the XDM spec中所定义;“非正式地,文档顺序是节点出现的顺序)文档的XML序列化“)?或者,有没有办法比较两个节点的文档位置?
这是我的意思的一个小例子。在实际情况中,列表由更复杂的过程构成,可能有数百个节点。
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 :(得分: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;
}