Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

24sept/088

Flex ActionScript – Ecriture et édition d'objets XML

Vous pouvez écrire et modifier des objets XML en utilisant ActionScript. Il y a trois choses que vous pouvez faire:

  • Modifier de la donnée existante
  • Ajouter de nouvelles données
  • Supprimer de la donnée existante

Vous pouvez modifier de la donnée existante en utilisant la même syntaxe E4X utilisée pour la lecture. Par exemple, le code suivant change le title du premier livre:

xml.book[0].title = "Premier Livre, Premier Tome";

L'exemple suivant change le nom du second author du premier book:

xml.book[0].authors.author[1].@first = "Joseph";


Tous les exemples se basent sur ce fichier XML:

var xml:XML = <books>
	 <book>
		<title>Premier Livre</title>
		<authors>
			<author first="Henri" last="Smith"/>
			<author first="Bill" last="Wesson"/>
		</authors>
	 </book>
	 <book>
		<title>Second Livre</title>
		<authors>
			<author first="John" last="Stone"/>
			<author first="Sven" last="Ericsson"/>
			<author first="Bob" last="Dallas"/>
		</authors>
	 </book>
	</books>

Si vous voulez ajouter de la nouvelle donnée, vous pouvez utiliser les méthodes appendChild(), prependChild(), insertChildBefore() et insertChildAfter(). Chaque méthode insère un nouveau nœud XML dans une structure XML ou XMLList. Les méthodes appendChild() et prependChild() accèptent un paramètre et insèrent le nœud à la fin et au début de la structure, respectivement. L'exemple suivant ajoute un nouveau nœud publisher à chaque book:

xml.book[0].appendChild(<publisher>PubliEdition</publisher>);
xml.book[1].appendChild(<publisher>NouveauxEditeurs</publisher>);

Vous pouvez utiliser les méthodes insertChildBefore() et insertChildAfter() pour ajouter un nœud avant ou après un nœud existant. Chaque méthode requiert 2 paramètres: le nouveau node à ajouter et une référence à un nœud existant.
Le code suivant ajoute un noeud publicationDate entre les authors et les nœuds publisher d'un book:

xml.book[0].insertChildAfter(xml.book[0].authors, <publicationDate>2006<publicationDate>);
xml.book[1].insertChildAfter(xml.book[1].authors, <publicationDate>2007<publicationDate>);

Vous pouvez supprimer un élément en utilisant l'opérateur delete. L'exemple suivant ajoute un nouvel attribut middle à un nœud author puis le supprime:

xml.book[0].authors.author[1] = <author first="Henri" middle="Andy" last="Smith"/>;
trace (xml.book[0].authors);
delete xml.book[0].authors.author[1].@middle;
trace (xml.book[0].authors);

Articles similaires

Commentaires (8) Trackbacks (0)
  1. Salut !

    Merci pour ce tuto, mais j'aimerais savoir une chose : Est-il possible d'enregistrer le fichier XML ?
    Je veux dire : je charge le XML dans la variable xml, ensuite je fais

    Actionscript:
    1. xml.book[0].authors.author[1] = ;

    et puis je voudrais que le fichier .xml que j'ai chargé au début soit modifié. (qu'il ne soit plus comme à l'origine si je l'ouvre avec le bloc note par exemple)

    Merci :)

  2. Salut,
    tu ne peux écrire sur le disque qu'avec Flash Player 10. Il faut utiliser la méthode save() de FileReference:
    http://livedocs.adobe.com/flex/3/langref/flash/net/FileReference.html#save()
    Tu lui passes la data et voila :)

    Fabien

  3. Waaa !
    Réponse ultra rapide ! Merci :)

    C'est dommage, j'aurais voulu écrire avec flash player 6. Tant pis :)

    Merci

  4. Bonjour,

    J'aurais une question concernant cette méthode mais mon problème est plus global je pense.

    Quand je dois récupérer les données par l'E4X sur mes "énormes fichiers", je me retrouve avec un Error #1502 qui me dit qu'au bout de 15 seconde si mon traitement n'est pas fini, c'est qu'il y a un problème. Cependant mes traitements se déroulent bien mais se stoppent au bout du scriptTimeLimit que j'ai déja mis à 60secondes le maximum autorisé par Flex. Savez comment faire pour finir mes traitement sans que Flex ne détecte ça comme une erreur?

  5. Bonjour,
    Pour éviter l'erreur, il faut que vous sépariez votre tâche en sous-tâches. Vous pouvez par exemple extraire une boucle (boucle for par ex.) de votre fonction de traitement pour en faire une fonction à part que vous appellerez par "petits bouts", c'est a dire par tranches de X éléments par exemple. Vous pouvez aussi mettre cela dans un "pseudo-thread" (Flash Player n'a qu'un seul thread, il faut donc feinter). Pour cela, voyez cette classe :
    http://blogs.adobe.com/aharui/2008/01/threads_in_actionscript_3.html
    Vous pouvez aussi essayer d'optimiser votre traitement e4x (voir les conseils d'optimisation AS3 généraux) et éviter les instructions trace() qui ralentissent le traitment:
    http://www.flex-tutorial.fr/2009/01/06/flex-actionscript-optimiser-votre-code-as3/

    Fabien

  6. Merci beaucoup pour ces conseils, quand je lis comment améliorer le code, effectivement j'ai pas tout fait dans les règles de l'art.

  7. Et pour ajouter un attribut a un noeud existant, it's possible ? ^^

  8. Yes it is!
    Soit avec de l'e4x comme ceci:
    xml.book[0].title.@newAttr = "Valeur nouvel attribut du node title";
    Sinon il y a d'autres méthodes sur la classe XML pour les manipuler, direction la doc:
    http://livedocs.adobe.com/flex/3/langref/XML.html

    Fabien


Leave a comment

(required)

Aucun trackbacks pour l'instant