Se connecter avec
S'enregistrer | Connectez-vous

Lecture ecriture d'un fichier XML Air/As3

Dernière réponse : dans Programmation

Salut,
Je souhaite créer une classe qui me permette de lire un fichier xml et, si il s'avère vide, entrer une string par défaut.



J'ai le code suivant :

  1. import flash.filesystem.*;
  2. import flash.events.Event;
  3.  
  4. var file:File = File.documentsDirectory;
  5. file = file.resolvePath("AS3/Air Test/test.xml");
  6. var fileStream:FileStream = new FileStream();
  7. fileStream.openAsync(file, FileMode.UPDATE);
  8. var str:String;
  9. str = fileStream.readUTFBytes(fileStream.bytesAvailable);
  10. if(str == null)
  11. {
  12. var projectname = "projet1";
  13. var projectnumber = 1;
  14.  
  15. fileStream.writeUTFBytes("<projet " + projectnumber + "name='" + projectname + "' author='default' size='0' date='01/01/10'>");
  16. fileStream.addEventListener(Event.CLOSE, fileClosed);
  17. fileStream.close();
  18.  
  19. function fileClosed(event:Event):void
  20. {
  21. trace("closed");
  22. }
  23. }
  24. else
  25. {
  26. trace(str);
  27. }


Mais le problème c'est que ça m'affiche rien ni dans le xml ni dans la sortie : /.
Une idée ?
Merci d'avance.
Lassé par la pub ? Créez un compte

en debuggant = en mettant un point d'arrêt, pas en générant le programme :o 

méthode pas à pas, ajout d'espion sur ton string...

t'ain j'me fais vraiment chier pour poster dans la cat programmation moi :D 

Si tu clic sur les chiffres à gauche des lignes, t'as pas un rond qui s'affiche ? Ou une couleur qui viens sur la ligne ?

Si oui, c'est le point d'arrêt, tu le balance sur la ligne juste avant la réception de ton string.

Ensuite tu fais ton "ctrl shift entrée", et tu fais un clic droit sur le string, tu pourras surement ajouter un espion.

(alt + F5 pour exécuter le pas à pas)
Expert Programmation

Peut être parce que quand le fichier est vide c'est pas égal à "null" mais à "chaine vide" par exemple ?
Quand t'es en mode Debug, tu ne peux pas voir les détails des variables ?

et si tu remplaces null par "" ?

ou tu peux toujours compter les caractères dans ton string, et si c'est inferieur à 2, ou 1, tu passes dans ta if. Un peu barbare, mais bon au moins..

Bah en fait ce code s'inscrit dans une application dans laquelle j'ai besoin de faire une liste de projets qui serait stocké sous forme d'un xml. Et là je veux faire une fonction d'initialisation de mon xml. Normalement il ne doit pas ne rien avoir dans le fichier c'est pour ça que si y'a rien je met un project defaut mais si y'a quelque chose je passe à l'étape d'après : affichage de la liste de projets.

pas besoin de else dans ce cas là, tu fais ta fonction initialiser, et si le fichier est vide tu lui met le projet défaut, et c'est tout, pas besoin de else... S'il est pas vide il passe pas dans la if et sort de la fonction init.

Bon alors j'en ai discuté avec mon prof qui m'a dit que mon système c'était de la merde et qu'il fallait que je charge le XML dans des tableaux. Il m'a donc filé ce code :

  1. //charge le fichier voulu
  2. var c:URLLoader = new URLLoader(new URLRequest("Projets.xml"));
  3. c.addEventListener(Event.COMPLETE, comp);
  4.  
  5. //créer le tableau
  6. var tab:Array = [];
  7.  
  8. //fonction qui met le contenu du xml dans le tableau
  9. function comp(e){
  10. //affiche le contenu du fichier
  11. trace(e.target.data);
  12.  
  13. var xmlTmp:XMLList = new XML(e.target.data).*;
  14. //xmlTmp contient le contenu du fichier XML
  15. var nb:int = xmlTmp.length();
  16. //affiche la longueur du fichier (nombre de projets)
  17. trace(nb);
  18.  
  19. //on crée un tableau d'objets
  20. var o:Object = {};
  21. for(var i:int = 0 ; i < nb ; i++){
  22. o = {};
  23. [color=#ff0000]for each (var n:XML in xmlTmp[i].@*)[/color]{
  24. trace(n.name(), n);
  25. o[n.name().toString()] = n;
  26. }
  27. tab.push(o);
  28. }
  29.  
  30. trace(tab[0].dmodif);
  31.  
  32. save();
  33. }
  34.  
  35.  
  36.  
  37. function save(){
  38.  
  39. tab[1].projet = "projet1";
  40.  
  41. var str:String = "<?xml version='1.0' encoding='ISO-8859-1'?><base>";
  42.  
  43. for(var i:int = 0 ; i < tab.length ; i++){
  44. if(i == 1){
  45. str += "\n<elt ";
  46. for(var m:* in tab[i]){
  47. if(m == "projet") str += m+"=\""+tab[i][m]+"\" ";
  48. }
  49. str += " />";
  50. }
  51. }
  52. str += "</base>";
  53. trace(str);
  54. }


Ça marche pas trop mal, sauf la fonction save() à laquelle je pige pas grand chose ainsi que ce que j'ai mis en rouge.

Donc si vous avez encore une idée :p 
Expert Programmation

Salut,

Je fais pas d'AS, mais ça devrait être ça :
  1. for each (var n:XML in xmlTmp[i].@*)

Vu que c'est du XML, ça fait une boucle sur tous les éléments du tableau. Le @ précise que l'on spécifie des attributs, et le * précise que l'on veut tous les éléments.
xmlTmp.@* veut dire que l'on récupère tous les attributs de cet élément.

Et pour le save (voir commentaires en vert):

  1. function save(){
  2. tab[1].projet = "projet1";
  3. // Initialise une chaine qui va contenir du XML. (c'est le header du XML avec un élément root nommé base)
  4. var str:String = "<?xml version='1.0' encoding='ISO-8859-1'?><base>";
  5. for(var i:int = 0 ; i < tab.length ; i++){
  6. if(i == 1){
  7. // Ajoute un nouveau noeud XML auquel il va ajouter des attributs, donc il l'ouvre juste.
  8. str += "\n<elt ";
  9. // Pour tous les éléments du tableau
  10. for(var m:* in tab[i]){
  11. // Si le nom de l'élément est "projet", il ajoute un attribut à notre noeud XML nommé "project" (m) avec comme valeur tab[i][m]
  12. if(m == "projet" ) str += m+"=\""+tab[i][m]+"\" ";
  13. }
  14. // ferme le noeud XML
  15. str += " />";
  16. }
  17. }
  18. // ferme la racine XML
  19. str += "</base>";
  20. trace(str);
  21. }


Ca va te donner un fichier XML du type:
  1. <?xml version='1.0' encoding='ISO-8859-1'?>
  2. <base>
  3. <elt project="valeur" />
  4. </base>

Nan en fait le code marchait bien smoi qui faisait de la daube. Et merci pour les explications !

Bon maintenant en fait je voudrais une fonction qui puisse ajouter un projet par exemple à la fin du XML (avant la balise de fin évidemment).
Si j'utilise un

var x:XML = new XML("<a>test</a>");

ça me réécrit tout, y'a pas moyen de chatouiller qu'un seul champ à la fois ?

Merci encore =)

Bon alors du coup maintenant j'ai besoin d'un diffuseur d'évènement.
J'ai une classe qui charge mon XML dans un tableau. Et je voudrais que quand ça c'est fait, (le tableau est plein), ça m'envoie un event.
J'ai farfouillé sur google et je suis tombé sur ....

  1. package {
  2.  
  3. import flash.display.Sprite;
  4. import flash.events.Event;
  5.  
  6. public class monDispatcher extends Sprite {
  7.  
  8. public function MyDispatcher() {
  9. this.addEventListener("evenementPersonnalise", handler);
  10. this.dispatchEvent(new Event("evenementPersonnalise"));
  11. }
  12.  
  13. private function handler(event:Event):void {
  14. trace(event.type);
  15. }
  16. }
  17. }


Je copie colle dans flahs et pas moyen de le tester ça me met :
1037: Packages cannot be nested.
En gros mon package peut pas être encapsulé .... mais je pige pas pkoi ?

Des idées ? :p 
Expert Programmation

C'est que tu mets ce code à l'intérieur d'une autre classe. J'imagine que tu ne dois pas avoir que ça comme code dans le fichier.
Essaie de mettre cette déclaration, soit dans un autre fichier, soit après avoir fermé la déclaration d'une classe (je crois pas qu'il y ait trop de notions de "fichiers" en AS)

Dsl du double post, mais je cherche maintenant à supprimer des champs de mon XML.

mon XML ressemble à ça :

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <data titre="Projets">
  3. <projet num="01" nom="A SUPPRIMER" dateCrea="10/05/10" dateMAJ="10/05/10" srcimg="img/bg.jpg" xml="projets/projet1.xml"/>
  4. <projet num="02" nom="A SUPPRIMERaussi" dateCrea="10/05/10" dateMAJ="10/05/10" srcimg="img/bg.jpg" xml="projets/projet2.xml"/>
  5.  
  6. </data>


et ce que je veux c'est supprimer tous mes projets et donc tous les champs <projet ....../>

si vous avez une idée =)


(toujours en AS3 / Air bien sur)

merci
Lassé par la pub ? Créez un compte
Tom's guide dans le monde