2010-01-10 3 views
0

Je vais avoir un problème un peu délicat ...AS3: en insérant des éléments XML alphabétiquement une propriété

Je générer un fichier XML au sein d'une classe que je vous écris. Disons que ce fut le XML de départ:

<base> 
    <container id="0"> 
     <element type="Image" x="0" y"0" /> 
     <element type="Image" x="100" y"0" /> 
    <container/> 
</base> 

Je veux ajouter <element> « s supplémentaires. Le premier ordre de tri est par "type", puis "x", puis "y". Donc si j'ajoute un nouveau "type" de <element>, disons "Texte", je veux que le texte soit inséré après "Image" <element>.

Par exemple:

<base> 
    <container id="0"> 
     <element type="Image" x="0" y"0" /> 
     <element type="Image" x="100" y"0" /> 
     <element type="Text" x="200" y"100" /> 
    <container/> 
</base> 

L'idée de base est de garder la liste triée comme ajouter plus <element> « s à chaque <container> ... Le tri numérique est assez simple, mais je ne peux pas comprendre un moyen propre de trier par ordre alphabétique.

Des suggestions sont appréciées.

La seule chose que je peux penser est de mettre les types dans un tableau. Ajouter le "nouveau type", trier et appeler indexOf() ... le numéro DEVRAIT être la position actuelle que je devrais insérer avant? Se sent kludgy.

Répondre

0

Je suggère de lire tous les éléments XML existants dans un tableau, en ajoutant vos nouveaux éléments, en triant le tableau, puis en réécrivant chaque élément. Cela peut être plus facile que d'essayer de déterminer à quel index chaque nouvel élément doit être inséré. Cependant, cela peut ne pas être très efficace, selon votre situation.

Pour faire le tri, je voudrais essayer quelque chose comme ça (non testé):

array.sort(function (a:XML, b:XML) { 
    if ([email protected] < [email protected]) return -1; 
    if ([email protected] > [email protected]) return +1; 
    if (Number([email protected]) != Number([email protected])) return Number([email protected]) - Number([email protected]); 
    return Number([email protected]) - Number([email protected]); 
}); 

EDIT: Ajouté jette dans le genre fonction de comparaison.

0

Pouvez-vous modifier la structure XML? Vous pouvez envelopper tous les éléments Image dans un nœud <images>, les éléments Texte dans un nœud <texts> et ainsi de suite, et ainsi ajouter des éléments au bon endroit serait facile.

Vous pouvez toujours obtenir tous les noeuds <element> en accédant à base.container.*.element.

-1

testé ... en supposant que vous ayez un code XML valide, et que vous créez une variable pour le fichier XML trié avec le même enfant racine que le fichier XML d'origine. Le mien est juste arrivé à être des appareils.

var sortedXML:XML = <devices></devices>; 

function sortBy(xmlFile:XML , field:String, order:int) 
{ 
    // array that will hold index of nodes 
    var arr:Array = new Array(); 
    // loop through nodes 
    for each (var someNode:XML in xmlFile.*) 
    { 
     // array gets populated with node that matches 'field' 
     arr.push(someNode.child(field)); 
    } 
    // sort the 'arr' array alphabetically 
    arr.sort(); 

    // reverse the alphabetical order if necessary 
    if (order == -1) 
    { 
     arr.reverse(); 
    } 

    // append the nodes in from the source, in the order of the array 
    for (var i:int=0; i<arr.length; i++) 
    { 
    sortedXML.appendChild(myXML.device.(child(field) == arr[i])); 
    } 
} 
// trace your original xml then trace sortedXML to verify 
+0

que vous avez remarqué, il n'y a pas appel à la fonction dans l'exemple ... pour mon XML l'appel était de trier mes périphériques par le noeud ID sortBy (myXML, « deviceID », 1); tout entier mais -1 va trier par ordre alphabétique ascendant ... devrait probablement changer cela si (ordre == -1) à si (ordre <0) alors les nombres positifs sortent en avant, et negs sort inverse. – Breezy3Stacks