Forums Développement Multimédia

Aller au contenu

AS2 : Flash/XML compter noeud enfant (niveau 4)

xml noeud as2 CODE Actionscript

6 réponses à ce sujet

#1 Hybrid

    Ceinture Blanche

  • Members
  • Pip
  • 9 messages

Posté 23 April 2012 - 10:53 AM

Hello @all,

Je me permets de poster un sujet "AS2" dans la partie "AS3", sorry, mais comme il n'est plus possible de poster en AS2. Preuve qu'il serait vraiment temps que je me mette à l'AS3 !

Alors, pour vous exposer mon cas.

Je travaille actuellement sur un projet de site [full flash] exploitant un XML.
Au début mon XML avait une structure simple.


<news>
- <article />
- <article />
- <article />
(...)
</news>
 

Avec cette structure, il était très simple de compter le nombre de noeuds par savoir combien il y a d'articles.



Nodes = MyXML.firstChild.childNodes;
NodesTotal = Nodes.length;

 

Cependant, pour les besoins du projets, j'ai XML structurer d'avantages le XML.


<news>
- <date>
-- <categorie>
--- <article />
--- <article />
--- <article />
-- </categorie>
- </date>

- <date>
-- <categorie>
--- <article />
--- <article />
-- </categorie>
- </date>
</news>
 

Et là... je ne trouve pas la méthode pour compter le nombre d'articles.
J'ai tenté avec plusieurs boucles for, pour "date" et "categorie", pour le moment sans succès, mais suis-je sur la bonne voix ?

Merci pour votre aide !

#2 Hybrid

    Ceinture Blanche

  • Members
  • Pip
  • 9 messages

Posté 23 April 2012 - 11:42 AM

Alors, j'ai pondu un truc simple qui fonctionne.


date = 0;
categorie = 0;
article = 0;
 
for (var l = 0; l < MyXML.firstChild.childNodes.length ; l++) {
var news = date+1;
   
  for (var m = 0; m < MyXML.firstChild.firstChild.childNodes.length ; m++) {
  var categorie = categorie+1;
   
    for (var n = 0; n < MyXML.firstChild.firstChild.firstChild.childNodes.length ; n++) {
    var article = article+1;
    }
 
  }
}
 

Sur le principe OK, ainsi je peux connaitre le nombre total de chaque noeud, sous-noeud, etc...
Mais ça me pause des soucis pour ma fonctionnalité de génération de MovieClip pour chaque article.

Donc si vous connaissez une méthode alternative, je suis preneur ^^

Merci

#3 Hybrid

    Ceinture Blanche

  • Members
  • Pip
  • 9 messages

Posté 26 April 2012 - 14:35 PM

Après moult tentative, je suis parvenu au résultat souhaité, même si techniquement je ne trouve pas cela très propre.

Au final, je suis partie de ma boucle for, et j'y ai intégré à l'intérieur mes différentes fonctions.
Ca marche, mais y'a surement mieux.

Merci tout de meme

#4 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 26 April 2012 - 15:33 PM

Désolé de n'avoir pas vu la question plus tôt…

… du moment que tu ai réussi, c'est le principal. Pas très propre, ça ne veut pas forcément dire grand chose.
Sinon, et si ça peut te servir encore, moi je préfère utiliser des boucles for each pour construire mes objets à partir d'un xml.

Je fais ça de cette façon :

var xml:XML =
   <news>
          <date parution="21 mai 2012">
                 <categorie titre="Edito">
                        <article titre = "Allo la terre, ici la lune" />
                 </categorie>
                 <categorie titre = "A la une">
                        <article titre = "un"/>
                        <article titre = "deux"/>
                        <article titre = "trois"/>
                 </categorie>
          </date>
          <date parution = "22 mai 2012">
                 <categorie titre = "Edito">
                        <article titre = "Allo la lune, ici la terre"/>
                 </categorie>
                 <categorie titre = "A la une">
                        <article titre = "un"/>
                        <article titre = "deux"/>
                 </categorie>
          </date>
   </news>


for each (var date:XML in xml.date) {
   for each (var categorie:XML in date.categorie) {
          for each (var article:XML in categorie.article) {
                 creer_article(article,categorie,date);
          }
   }
}

function creer_article(article:XML,categorie:XML,date:XML):void {
   // Ici, je crée mon objet (ou la plupart du temps, j'utilise une classe dédiée)
   trace("Article : " +article.@titre);
   trace("[ Catégorie : " + categorie.@titre + " ]");
   trace(date.@parution+"\n");
}
 


#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 26 April 2012 - 15:37 PM

Aïe. désolé, je n'avais pas vu que tu étais en AS2.
Je crois que l'instruction for each n'existait pas encore. Mais il y a sans doute moyen d'adapter le principe avec un for classique (ça sera un peu plus verbeux).

#6 Hybrid

    Ceinture Blanche

  • Members
  • Pip
  • 9 messages

Posté 04 May 2012 - 15:45 PM

Merci pour le tuyau, mais effectivement for each n'existe pas (me semble-t-il) en AS2.
Je le saurai quand je passerai en As3 ;)

#7 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 04 May 2012 - 16:54 PM

salut
pour parcourir tous les nodes utilise ue fonction recursive

var xml:XML = new XML();
xml.onLoad = function()
{
    parcourXML(xml);
    trace(nbArticle);
}
xml.load("data.xml");

var nbArticle:Number = 0;

function parcourXML(node:XMLNode)
{
    if(node.nodeName=="article")
    {
        nbArticle++
    }
    for(var i:Number = 0; i<node.childNodes.length; i++)parcourXML(node.childNodes[i]);
   
}
 
a+



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)