En effet, à chaque fois que l'on me demande quelles sont les nouveautés significatives de ActionScript 3 je débute toujours par cette nouvelle façon de manipuler les contenus XML. Surement que cela est dû à des longues heures de prises de têtes à construire des requêtes DOM toutes aussi longues que peu intuitives et pour le moins indigestes à un non-initié. N'ayons pas peur de l'avouer, l'exploitation du format XML sous ActionScript était loin d'être la panacée.

Heureusement, l'API de cette dernière version amène avec lui quelques nouvelles classes fortes intéressantes: XML (qui devient un objet natif), XMLList, QName, et Namespace qui vont permettre d'utiliser les fonctionnalités du standard E4X.

E4X: Quelques explications

E4X, ECMAScript for XML, n'est rien d'autres qu'un ensemble de classes et de fonctionnalités permettant de travailler avec des données au format XML. E4X a été normalisé par l'Ecma International dans le standard ECMA 357 dans sa première version en juin 2004 (seconde en décembre 2005).

Cette norme a pour but de vous permettre d'écrire et comprendre le code nécessaire au parsing de données XML aussi facilement et naturellement que possible. Vous manipulerez par exemple les contenus XML avec une syntaxe qui ne vous est pas étrangère, à l'image de l'opérateur point (.).

Exemple

Dans cet exemple simple, je vous propose de comparer la méthode AS2 à celle AS3 pour parser un contenu XML identique.

Déclaration du XML

ActionScript 1/2

actionscript
var gallery:XML = new XML("<gallery><image url='http://www.foo.com/foobar.jpg'><name>Foobar</name><description>Foobar desc</description></image><image url='http://www.foo.com/foobar1.jpg'><description>Foobar1 desc</description></image><image url='http://www.foo.com/foobar2.jpg'><description>Foobar2 desc</description></image></gallery>");

ActionScript 3

actionscript
var gallery:XML = <gallery> <image url="http://www.foo.com/foobar.jpg"> <name>Foobar</name> <description>Foobar desc</description> </image> <image url="http://www.foo.com/foobar1.jpg"> <description>Foobar1 desc</description> </image> <image url="http://www.foo.com/foobar2.jpg"> <description>Foobar2 desc</description> </image> </gallery>;

Comme vous le constatez, vous pouvez directement déclarer votre contenu XML comme tel. Il est devenu obsolète de déclarer une instance de l'objet XML et de parser ensuite une string.

Opérations simples

ActionScript 1/2

actionscript
trace(gallery.firstChild.childNodes[0].attributes.url); // http://www.foo.com/foobar.jpg trace(gallery.firstChild.childNodes[1].firstChild.firstChild.nodeValue); // Foobar1 desc  

ActionScript 3

actionscript
trace(gallery.image[0].@["url"]); // http://www.foo.com/foobar.jpg trace(gallery.image[1].description); // Foobar1 desc  

Est-il besoin de préciser que la deuxième syntaxe est autrement plus claire à lire et à utiliser?

Boucles et conditions

ActionScript 1/2

actionscript
var nLength:Number = gallery.firstChild.childNodes.length; for(var i:Number = 0; i < nLength; i++) { var child:XMLNode = gallery.firstChild.childNodes[i]; if(child.attributes.url == "http://www.foo.com/foobar2.jpg") { trace(child.firstChild.firstChild.nodeValue); // Foobar2 desc } }

ActionScript 3

actionscript
trace(gallery.image.(@url == "http://www.foo.com/foobar2.jpg").description); // Foobar2 desc  

Ca en devient presque vexant ;)

Modification du contenu

ActionScript 1/2

actionscript
var newNode:XMLNode = gallery.createElement("image"); var subNode:XMLNode = gallery.createElement("description"); var subNodeText:XMLNode = gallery.createTextNode("Foobar3 desc"); newNode.attributes.url = "http://www.foo.com/foobar3.jpg"; subNode.appendChild(subNodeText); newNode.appendChild(subNode); gallery.firstChild.appendChild(newNode);

ActionScript 3

actionscript
var newNode:XML = <image url="http://www.foo.com/foobar3.jpg"> <description>Foobar3 desc</description> </image>; gallery.appendChild(newNode);

Ca se passe de commentaires... mais pas de benchmarks. Je doute en effet que cette méthode s'avère plus couteuse que l'ancienne. Reste à constater le rapport utilisabilité/performance. L'ancienne méthode étant toujours présente dans l'API (flash.xml.XMLDocument), je prendrai le temps de faire quelques tests.

Sources

Classe AS2 / Classe AS3