2009-12-08 6 views
1

Est-il possible de trier une XMLList? Tous les exemples que je peux trouver sur elle créer une nouvelle XMLListCollection comme ceci:Flex Débutant XMLList question - Tri XML et XMLList

MyXMLListCol = new XMLListCollection(MyXMLList); 

Je ne pense pas que dans ce cas XMLListCollection a toute référence à la XMLList il tri donc quitter mon XMLList non triés, est-ce correct ?

Comment trier le XMLList directement?

Merci Mike ~

+0

pourquoi voulez-vous le faire? presque toutes les applications de xmllist qui pourraient nécessiter un tri sont effectuées via xmllistcollection – Amarghosh

+0

Une raison spécifique pour laquelle l'objet XMLList doit être trié alors qu'une XMLListCollection peut facilement fonctionner pour vous? – Sri

+0

Je ne peux pas décrire mon besoin pour cela dans les 600 caractères que j'ai. Mon application est l'importation et la maintenance d'une grande variable XML, et si je commence à couper et modifier des clones de nœuds de cette variable, il serait difficile de garder la variable d'origine à jour. J'espérais être capable de faire des actions de tri sur la variable directement. – invertedSpear

Répondre

2

J'ai donc finalement trouvé mes termes de recherche suffisamment modifiés pour que je réponde à cette question. En utilisant la technique que je suis d'ici: http://freerpad.blogspot.com/2007/07/more-hierarchical-sorting-e4x-xml-for.html

j'ai pu venir avec ceci:

public function sortXMLListByAttribute(parentNode:XML,xList:XMLList,attr:String):void{ 
//attr values must be ints 
var xListItems:int = xList.length(); 
if(xListItems !=0){ 
    var sortingArray:Array = new Array(); 
    var sortAttr:Number = new Number(); 
    for each (var item:XML in xList){ 
     sortAttr = Number(item.attribute(attr)); 
     if(sortingArray.indexOf(sortAttr)==-1){ 
      sortingArray.push(sortAttr); 
     } 
     //piggy back the removal, just have to remove all of one localName without touching items of other localNames 
     delete parentNode.child(item.localName())[0]; 
    } 
    if(sortingArray.length > 1) { 
     sortingArray.sort(Array.NUMERIC); 
    } 

    var sortedList:XMLList = new XMLList(); 
    for each(var sortedAttr:Number in sortingArray){ 
     for each (var item2:XML in xList){ 
      var tempVar:Number = Number(item2.attribute(attr)); 
      if(tempVar == sortedAttr){ 
       sortedList += item2 
      } 
     } 
    } 
    for each(var item3:XML in sortedList){ 
     parentNode.appendChild(item3); 
    } 
} 
} 

Works assez rapide et conserve ma variable XML d'origine mis à jour. Je sais que je peux réinventer la roue juste pour ne pas utiliser un XMLListCollection, mais je pense que la capacité de trier XML et XMLLists peut être très importante.

0

Bien qu'il n'y ait pas d'équivalent natif à la fonction Array.sortOn, il suffit trivial d'implémenter votre propre algorithme de tri:

// Bubble sort. 

// always initialize variables -- it save memory. 
var ordered:Boolean = false; 
var l:int = xmlList.length(); 
var i:int = 0; 
var curr:XML = null; 
var plus:XML = null; 
while(!ordered) 
{ 
    // Assume that the order is correct 
    ordered = true; 
    for(i = 0; i < l; i++) 
    { 
     curr = xmlList[ i ]; 
     plus = xmlList[ i + 1 ];  

     // If the order is incorrect, swap and set ordered to false. 
     if(Number([email protected]) < Number([email protected])) 
     { 
      xmlList[ i ]  = plus; 
      xmlList[ i + 1 ] = curr; 
      ordered = false; 
     } 
    } 
} 

mais, de façon réaliste, il est loin plus facile et moins buggé d'utiliser XMLListCollection. De plus, si quelqu'un d'autre lit votre code, ils le trouveront plus facile à comprendre. S'il vous plaît faites-vous une faveur et évitez de réinventer la roue à ce sujet.

+0

Ceci est un extrait de code génial. Simple et précis. Je vous remercie. – invertedSpear

+0

Après quelques tentatives j'ai abandonné pour faire fonctionner ce code, il semble aller dans un infini (ou au moins une très très longue boucle) – invertedSpear

+0

Certes, avec XMLLists, si la longueur est excessive, ce code ne fonctionnera pas terriblement efficace. Mais, vous pourriez être en mesure de regarder directement dans le SDK et de voir comment XMLListCollection implémente le tri. – cwallenpoole

Questions connexes