2009-08-13 7 views
0

Dans une application Web Flex, existe-t-il un moyen facile d'appliquer un tri aux enfants d'un élément XML, en fonction des attributs des enfants? Exemple suit ci-dessous:Tri des sous-éléments XMLListCollection par flexion

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>

je voudrais trier les <e> éléments, au sein de chaque élément <a> séparément, en fonction de leur attribut "prop". Mon code pour générer le tableau contenant les <a> éléments est le long des lignes de:

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 la fin, je voudrais les s <a> de » rester dans leur ordre défini, mais leurs <e> enfants à trier basée sur la attribut "prop". Jusqu'à présent, si je tente:

node.children() sort = someSortVar

où someSortVar a ses champs mis à:.

SortFields ("e @ prop", ...)

Je reçois une exception à propos d'une valeur nulle. Un moyen de convertir la liste des enfants en XMLListCollection, le trier et l'intégrer dans la variable de noeud? Merci pour vos réponses.

+0

Résolu en trouvant du code sur les forums Adobe Flex. – raptors

Répondre

0

je suis venu avec deux solutions: La première concernait la conversion d'un XMLList à un tableau et le tri sur le tableau:

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); 
    } 
    } 

La seconde consistait à utiliser l'attribut de tri d'un XMLListCollection, bien que Je crois que les <un> enfants sont un XMLList, pas 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()); 
    } 
+0

Merci beaucoup pour la solution - les liens des forums Adobe contenaient aussi des solutions, mais ils avaient un peu de surcharge en termes de fonctions d'aide et autres joyeusetés, je pense que je vais aller avec votre approche impliquant XMLListCollection. – raptors

+1

Je ne peux pas éditer votre message mais vous avez oublié xcol1.refresh(); dans l'approche XMLListCollection. Juste une note à n'importe qui qui arrive à rencontrer cette question à l'avenir. – raptors

+0

J'espère que je l'ai ajouté au bon endroit. –

1

Vous pouvez utiliser la fonction sort sur la baie avec une fonction de comparaison.

... args - Les arguments spécifiant une fonction de comparaison et une ou plusieurs valeurs qui déterminent le comportement de le genre. Cette méthode utilise la syntaxe et l'ordre l'argument Array.sort (compareFunction, sortOptions) avec les arguments définis comme suit:

compareFunction - Une fonction de comparaison utilisée pour déterminer l'ordre des éléments tri dans un tableau. Cet argument est facultatif. Une comparaison fonction devrait prendre deux arguments à comparer.Étant donné les éléments A et B, le résultat de compareFunction peut avoir l'une des trois valeurs suivantes: -1, si A doit apparaître avant B dans la séquence triée 0, si A est égal à B 1, si A doit apparaître après B dans le tri sequenceOptions - Un ou plusieurs nombres ou constantes définies, séparés par le | (OU bit à bit) opérateur , qui modifient le comportement de le tri par défaut. Cet argument est facultatif. Les valeurs suivantes sont acceptables pour sortOptions: 1 ou 2 Array.CASEINSENSITIVE ou Array.DESCENDING 4 ou Array.UNIQUESORT 8 ou Array.RETURNINDEXEDARRAY 16 ou Array.NUMERIC Pour plus d'informations, voir la Array.sortOn() méthode.

+0

Désolé - édité le titre et le code - Je suis en train d'utiliser XMLListCollection pas un tableau. L'exemple XML dans ma publication serait cette XMLListCollection ( ...). – raptors

0

Nous avons trouvé des implémentations de code adaptées sur les forums Adobe - désolé de ne pas y avoir cherché d'abord.

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

+0

Un autre lien pour une implémentation de code différente est http://forums.adobe.com/message/1950215#1950215 – raptors