按文档顺序对AS3 XMLList进行排序

时间:2011-09-22 18:19:55

标签: xml actionscript-3 e4x

在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)并没有真正的文档概念,更不用说文档顺序了。

1 个答案:

答案 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;
}