Votre question

Lecture ecriture d'un fichier XML Air/As3

Tags :
  • Programmation
Dernière réponse : dans Programmation
7 Mai 2010 19:35:53

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.

Autres pages sur : lecture ecriture fichier xml air as3

a c 232 L Programmation
7 Mai 2010 23:27:11

Salut,

Et en debuggant ?
m
0
l
7 Mai 2010 23:43:01

Tout va bien il me trouve aucune erreur : / d'où ma question ^^
m
0
l
Contenus similaires
7 Mai 2010 23:46:36

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 
m
0
l
7 Mai 2010 23:59:40

Tiens bah si tu t'ennuie toujours, tu peut m'expliquer vite fait comment faire un "ajout d'espion sur mon string" ? :p 
m
0
l
8 Mai 2010 00:00:15

Tu programmes sous quoi ?
m
0
l
8 Mai 2010 00:03:25

flash CS5
m
0
l
8 Mai 2010 00:08:15

Omar ? :whistle: 

Non, là, aucune idée... Screen ta barre de menu pour voir :o 
m
0
l
8 Mai 2010 00:13:29



i hope u speak english =)
m
0
l
8 Mai 2010 00:16:36

Bon bah du coup, apparemment, même quand mon fichier xml est vide il passe pas dans le if, il passe direct à else ...
m
0
l
8 Mai 2010 00:18:25

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)
m
0
l
a c 232 L Programmation
8 Mai 2010 00:46:48

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 ?
m
0
l
8 Mai 2010 00:49:22

Clic droit sur "str" ligne 10, regarde si tu peux pas "ajouter un espion" ou une connerie comme ça.
m
0
l
8 Mai 2010 12:31:23

Je vois rien de tel. Et pour le null j'ai vérifié mais normalement une string vide vaut null. Et je sais pas comment voir le détail des variables si c'est possible ^^.
m
0
l
8 Mai 2010 12:40:23

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..
m
0
l
8 Mai 2010 15:23:40

Ha bah oui, c'est bien sur ! Avec == "" ça marche. Par contre quand je recompile une fois le xml rempli par la première compilation ça passe pas au else : D
m
0
l
a c 232 L Programmation
8 Mai 2010 17:38:51

pourquoi veux-tu que ça passes au else s'il y a déjà quelque chose dedans ?
m
0
l
8 Mai 2010 17:50:01

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.
m
0
l
8 Mai 2010 18:46:10

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.
m
0
l
8 Mai 2010 19:19:55

Ouaip en effet ! Merci
m
0
l
8 Mai 2010 19:21:06

Tiens nous au courant de l'avancement, bon courage ;) 
m
0
l
14 Mai 2010 14:44:46

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 
m
0
l
a c 232 L Programmation
14 Mai 2010 15:58:25

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>
m
0
l
15 Mai 2010 15:30:48

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 ?
m
0
l
a c 232 L Programmation
15 Mai 2010 19:27:40

Avant le str += "</base>"; tu mets str += "<a>test</a>";
m
0
l
20 Mai 2010 21:41:50

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 
m
0
l
a c 232 L Programmation
20 Mai 2010 23:38:07

Euh, essaie de supprimer la déclaration du package (1ère et dernière ligne) au hasard ? :) 
m
0
l
21 Mai 2010 00:32:11

bah j'ai essayé, en supprimant les extends public etc.... liés au package et ça me fait la même erreur mais avec les classe. Ça me dit que ça peut pas encapsuler les classes ...
m
0
l
a c 232 L Programmation
21 Mai 2010 01:28:27

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)
m
0
l
23 Mai 2010 20:55:25

Bon merci mais en fait j'ai tout chamboulé :p .
Mon prof m'a filé un dispatch tout fait :D . Reste plus qu'a comprendre et placer correctement !
m
0
l
27 Mai 2010 17:28:14

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
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS