E4X: Une nouvelle approche des manipulations XML
Par Stéphane Bebrone le lundi, avril 24 2006, 22:56 - Flash - Lien permanent
Traduit de la documentation ''officielle'' de Adobe Flex Builder Beta 2, ce titre introduit un court article sur une des nouvelles fonctionnalités phares (bien loin d'être la seule) de ActionScript 3.
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
actionscriptvar 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
actionscriptvar 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
actionscripttrace(gallery.firstChild.childNodes[0].attributes.url); // http://www.foo.com/foobar.jpg trace(gallery.firstChild.childNodes[1].firstChild.firstChild.nodeValue); // Foobar1 desc
ActionScript 3
actionscripttrace(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
actionscriptvar 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
actionscripttrace(gallery.image.(@url == "http://www.foo.com/foobar2.jpg").description); // Foobar2 desc
Ca en devient presque vexant ;)
Modification du contenu
ActionScript 1/2
actionscriptvar 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
actionscriptvar 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.
Commentaires
En fait c'est comme le XPATH mais en mieux et en natif ! Reste que je continue à penser que le XML est pas un moyen obligatoire pour arriver à ses fins... on verra bien si il va évoluer ou pas ? Surtout au niveau de flash.. le parseur est beaucoup trop lent et même si ils simplifient la syntaxe avec l'E4X il sera toujours autant difficile dans l'état actuel d'utiliser essentiellement du XML pour des grosses récupérations de données :(
Je suis un peu d'accord avec Eka, mais ça à quand même l'air bien puissant. Et puis c'est de pair avec une nouvelle VM plus performante...
Cela dit, je me demandais : comment peut-on "concatener" le XML avec des variables de notre code ? Du genre : comment pourrait-on remplacer le 3 de foobar3 par une variable dans ton dernier exemple ?
Bonne question Philippe :)
La nomenclature d'insertion dynamique respecte le standard:
Tu as raison Eka, je me détache de plus en plus du XML comme format d'échanges de données (pour les alternatives que l'on connait: json, eden...). Par contre E4X, me permetrait par exemple d'éviter une classse helper pour manipuler des fichiers de configuration (où la verbosité du XML est un atout). Ou bien encore dans le traitement d'un fil RSS, réponse d'un webservices... là où le XML est un standard.
Outre la pertinence de l'utilisation du XML (laissée au choix du développeur), E4X lui fournit un moyen simple d'accèder au contenu XML. C'est là son but. Mais à quel prix ? Je ferai quelques benchmarks prochainement.
++ :)
Je vais faire mon râleur. Pas mal de monde espérait l'XPATH et c'est l'E4X qui est arrivé. XPATH est extrêmement puissant car il possède une infinité de possibilité de recherche. L'E4X, ce n'est même pas 2% des possibilités de l'XPATH.
Voir la différence ici :
http://www.w3schools.com/xpath/default.asp
http://www.w3schools.com/e4x/default.asp
Le seul avantage de l'E4X, c'est la syntaxe pointée. Mais il me semble que la puissance des outils de recheche est plus importante que la syntaxe.
/bookstore/book@id>2 AND @id<5 /bookstore/booklast() /bookstore/booklast()-1 /bookstore/bookprice>35.00 ...
C'est une grosse déception que les ingénieurs de MM/ADOBE n'aient pas voulu implémenter en natif un outil plus puissant. D'autant stupéfiant que la solution de xfactorstudio ( http://www.xfactorstudio.com/ ) y arrive déjà depuis des années de manière plus ou moins exhaustive, le tout, codé en actionscript.
Pour reprendre les propos de Neeld Tanksley, XPath et E4X ne poursuivent pas le même but. Ils ont certes des similitudes mais sont plus complémentaires que concurrents.
On peut donc être déçu de ne pas voir XPath dans l'API AS3 (alors qu'un début d'implémentation existe en Flash 8), mais se réjouir de l'apparition de E4X.
AMHA, le portage de XFactorStudio est très mature. Peut-être Adobe compte sur une mise à jour de leur part plutôt qu'investir eux-mêmes. Les extensions/librairies opensources sur le labs étant à la mode. N'oublions pas non plus qu'on est toujours dans une phase de beta (bien que l'échéance se rapproche).
Merci pour cette description. :)
Pour avoir tester les deux solutions, je dirais qu'en terme de rapidité l'e4x tiens ses promesses.
Et je suis d'accord avec SHAOKEN, XPATH et E4X n'ont pas la même finalité, à nous de prendre celle qui nous intéresse au moment ad'hoc
XFactorStudio est très mature ?
je suis d'accord avec SHAOKEN, XPATH et E4X n'ont pas la même finalité
remplacer le 3 de foobar3 par une variable dans ton dernier exemple ?
remplacer le 3 de foobar3 par une variable dans ton dernier exemple ?
thankss thesss
the endss thankss
the end.
superrrr
En effet la programmation XML en AS3 est bien plus simple qu'en AS2. L'AS3 est aussi beaucoup plus complet que l'AS2. Mais il est aussi beaucoup plus compliqué... j'ai encore du mal à faire le saut connaissant plutôt bien l'AS2 je ne m'y retrouve pourtant pas du tout en AS3 :|
sheep
téphane Bebrone
wow good performance
Sohbet Chat Sohbet odaları
Erdem Artan
Bartın
redhandfactory.com portal türkce portal