2011-09-22 3 views
0

Actionscript 3에서는 XML 순서대로 XMLList의 노드 (XML 형식의 인스턴스)를 정렬하는 방법이 있습니다 (the XDM spec에 정의 됨). "비공식적으로 문서 순서는 노드 문서의 XML 직렬화에 나타남 ")? 또는 두 노드의 문서 위치를 비교하는 방법이 있습니까?AS3 XMLList를 문서 순서로 정렬

다음은 내가 말하는 의미의 예입니다. 실제의 경우, 목록은 훨씬 더 복잡한 프로세스에 의해 생성되며 수백 개의 노드가있을 수 있습니다.

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

XMLListCollection을 사용해도 되겠습니까? 그것에는 정렬과 필터 기능이 내장되어 있습니다. –

+0

제안 해 주셔서 감사합니다. GUI가 아니기 때문에 나는 그것을 보지 않았다. 나는 한 번 살펴 봤는데 문서 순서에 따라 정렬 할 방법이 없다. –

+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; 
} 
관련 문제