Le Blog de SamsamTS

Classe XmlArray

Voici une petite classe qui permet de convertir du XML en tableau et inversement. La principale utilité, outre l'acces aux données quelque peu simplifié, est le fait de pouvoir ajouter, supprimer, etc... des noeuds de la même manière qu'avec un tableau puisque cette classe hérite de Array.
On peut sans doute l'améliorer, mais je la trouve déjà assez fonctionnelle pour la mettre ici :

Code :

dynamic class XmlArray extends Array {
   public function XmlArray(xmlstr:String) {
      if (xmlstr != undefined) {
         var xml = new XML(xmlstr);
         parse(xml.firstChild);
      }
   }
   public function load(url:String) {
      var xml = new XML();
      xml.ignoreWhite = true;
      xml.target = this;
      xml.onLoad = function(success) {
         if (success) {
            this.target.parse(this.firstChild);
         }
         this.target.onLoad(success);
      };
      xml.load(url);
   }
   public var onLoad:Function; //un EventDispatcher serait p-e plus approprié
   public function hasChild():Boolean {
      return (this.length>0);
   }
   // Retourne une chaine sous forme xml représentant le tableau
   public function toString():String {
      if (this.nodeName == undefined) {
         return undefined;
      }
      var str = "<"+this.nodeName;
      for (var att in this.attributes) {
         str += " "+att+"=\""+this.attributes[att]+"\"";
      }
      if (!this.hasChild() && this.data == undefined) {
         return str+" />";
      }
      str += ">";
      for (var i = 0; i<this.length; i++) {
         str += this[i].toString();
      }
      if (this.data != undefined) {
         if (this.data.indexOf("<")>=0 || this.data.indexOf(">")>=0) {
            str += "<![CDATA["+this.data+"] ]>";
         } else {
            str += this.data;
         }
      }
      return str+"</"+this.nodeName+">";
   }
   private function parse(node:XMLNode) {
      this.nodeName = node.nodeName;
      for (var att in node.attributes) {
         if (this.attributes == undefined) {
            this.attributes = new Object();
         }
         this.attributes[att] = node.attributes[att];
      }
      for (var i = 0; i<node.childNodes.length; i++) {
         if (node.childNodes[i].nodeName != undefined) {
            this.push(new XmlArray(node.childNodes[i].toString()));
         } else {
            this.data = node.childNodes[i].nodeValue;
         }
      }
   }
}


Son utilisation est plutôt simple :

Code :

var xmlarr = new XmlArray("<rootNode><unNoeud unAttribu=\"uneVal\" /><autreNoeud>texte</autreNoeud><encoreUn><![CDATA[du texte avec des < et des >] ]></encoreUn></rootNode>");
trace(xmlarr[0].attributes.unAttribu); //Sortie "uneVal"
trace(xmlarr[1].data); //Sortie "texte"
trace(xmlarr[2].data); //Sortie "du texte avec des < et des >"
//ajout d'un noeud enfant au noeud 0
xmlarr[0].push(new XmlArray("<noeudEnfant />"));


Voilà, si vous avez des question, remarques, suggestion, n'hésitez pas à m'en faire part ;) .

Vos commentaires

Le jeudi 18 novembre 2004 à 17:17 , commentaire par sebby :: #

 

tu peux mettre plusieurs niveaux de profondeurs dans ton fichier xml ?

 

Le jeudi 18 novembre 2004 à 17:43 , commentaire par SamsamTS :: #

 

Biensur ;)

 

Le vendredi 19 novembre 2004 à 08:42 , commentaire par ekameleon :: #

 

Hello :)
Au niveau de ton xml.onLoad pour que cela soit + propre tu devrais utiliser la classe mx.utils.Delegate à mon avis :
Au début de ta classe :

Code :

import mx.utils.Delegate

dans ta méthode load :

Code :


  private var _xml:XML ;

   public function load(url:String) {
      var _xml = new XML();
      _xml.ignoreWhite = true;
      _xml.onLoad = Delegate.create (this, _isLoad) ;
      xml.load(url) ;
}

  private function _isLoad (bool:Boolean) :Void {
         if (bool) parse (_xml.firstChild) ;
         // ici tu dispatch ton événement
  } ;

Voilà en gros :)
bye :)

 

Le vendredi 19 novembre 2004 à 09:14 , commentaire par Yaya :: #

 

Salut SamsamTS,
ce qui aurait ete sympa ^_^, aurait ete de mettre un pti exemple pour les novices comme moi... (associé as+exemple visuel .... quel bonheur :mrgreen: )

Yaya

 

Le vendredi 19 novembre 2004 à 13:48 , commentaire par SamsamTS :: #

 

eka > tu as sans doute raison je vais faire ca

Yaya > voici la strucyure que l'on obtient avec l'exemple ci-dessus :
- Avant le push :

Code :

Variable _level0.xmlarr = [object #4] [
    0:[object #5] [
      nodeName:"unNoeud",
      attributes:[object #6, class 'Object'] {
        unAttribu:"uneVal"
      }
    ],
    1:[object #7] [
      nodeName:"autreNoeud",
      data:"texte"
    ],
    2:[object #8] [
      nodeName:"encoreUn",
      data:"du texte avec des &lt; et des &gt;"
    ],
    nodeName:"rootNode"
  ]


- Après le push :

Code :

Variable _level0.xmlarr = [object #4] [
    0:[object #5] [
      0:[object #6] [
        nodeName:"noeudEnfant"
      ],
      nodeName:"unNoeud",
      attributes:[object #7, class 'Object'] {
        unAttribu:"uneVal"
      }
    ],
    1:[object #8] [
      nodeName:"autreNoeud",
      data:"texte"
    ],
    2:[object #9] [
      nodeName:"encoreUn",
      data:"du texte avec des &lt; et des &gt;"
    ],
    nodeName:"rootNode"
  ]

 

Le vendredi 19 novembre 2004 à 15:47 , commentaire par ekameleon :: #

 

Tu as du voir que je suis allé beaucoup trop vite au dessus, je me corrige pour ceux qui l'auraient pas vu :)

Code :

 

  private var _xml:XML ;

   public function load(url:String) {
      _xml = new XML();
      _xml.ignoreWhite = true;
      _xml.onLoad = Delegate.create (this, _isLoad) ;
      _xml.load(url) ;
}

bye :)

 

Le samedi 20 novembre 2004 à 09:23 , commentaire par Yaya :: #

 

:bravo:
Yaya

 

Le jeudi 21 avril 2005 à 11:03 , commentaire par UrukHai :: email :: #

 

Salut,
sympa cette classe, ça tombe bien j'en cherchais une comme ça pour l'implémenter avec la classe As2 que je viens de faire XMLManager.
Mon avis et qu'il faudrait mieux séparer le chargement d'un XML et sa transformation en Array, pour permettre un totale liberté du fichier XML.
Par contre je ne connaissais pas cette classe Delegate, je vais plus m'y pencher, merci encore pour l'info. ;)

 

Le lundi 2 mai 2005 à 23:05 , commentaire par SamsamTS :: #

 

Tu peux reprendre mon code si tu veux, mais n'oublie pas de me montrer le résultat de la "fusion" ;)

 

Le mardi 3 mai 2005 à 16:47 , commentaire par mike :: #

 

Super pratique ca, merci :)

 

Le lundi 6 juin 2005 à 10:36 , commentaire par [ NikO ] :: #

 

UrukHai >
Tu peux aller voir ici : wiki.media-box.net/tutori...

 

Le mercredi 28 septembre 2005 à 10:24 , commentaire par cousine :: email :: #

 

salut cousin, moi j'y comprends rien a tout ça mais c'est une bonne idée ce site, encore une fois tu m'épates :bravo:
a +, élise.

 

Le dimanche 3 février 2008 à 14:18 , commentaire par photo :: #

 

Merci pour le détail de cette classe. ;)

 

Le lundi 25 août 2008 à 03:12 , commentaire par hoteles :: email :: #

 

Nice

 

Ajouter un commentaire