Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

E4 x

Introduction

E4X est à Javascript ce que SimpleXml est au PHP : son but est de proposer une alternative à DOM pour accéder au contenu d'un fichier XML, et ce, - point important - le plus naturellement possible. E4X, normalisé par l'Ecma, tout comme Ecmascript (langage implémenté dans Mozilla sous le nom de javascript), étend donc la syntaxe de Ecmascript afin de pouvoir manipuler facilement un fichier XML.

E4X est disponible dans Gecko 1.8, donc depuis Firefox 1.5, Thunderbird 1.5 et XulRunner.

Exemples d'utilisation

Vous avez dans le langage Javascript un nouveau type d'objet qui a pour nom "xml".

Voici des exemples de manipulations , inspirés de l'introduction de Jon Udell sur E4X :

Création/Assignation

Une première méthode est d'instancier un objet XML en lui passant le contenu XML sous forme de chaine :

  var myXmlString = "<people><person id="1"><name>Moe</name></person><person id="2"><name>Larry</name></person></people>";
  var people = new XML(myXmlString);

En théorie, on peut aussi lui passer un objet DOM :

  var unObjetDom = document.getElementById('foo');
  var people = new XML(unObjetDom);

Mais cela ne fonctionne pas dans Gecko 1.8.

Il existe une autre méthode plus simple : on écrit simplement le xml en ligne.

 var people = <people>
        <person id="1">
             <name>Moe</name>
       </person>
       <person id="2">
             <name>Larry</name>
       </person>
    </people>;

On peut y insérer des valeurs dynamiquement, en indiquant le code javascript entre accolades :

 var unNom = "Moe";
 var unId=2;
 var people = <people>
        <person id="1">
             <name>{unNom}</name>
       </person>
       <person id={unId}>
             <name>Larry</name>
       </person>
    </people>;

Remarquez l'absence des quotes pour les attributs..

On peut aussi indiquer un nom de balise dynamiquement :

 var unNomDeTag="person";
 var people = <people>
        <{unNomDeTag} id="1">
             <name>Moe</name>
       </{unNomDeTag}>
    </people>;

type

  typeof(people)

renvoi "xml"

accés aux données

il y a plusieurs balises <person> en tant que fils de <people>. L'objet person est donc un tableau (ou plus exactement un objet XMLList, voir la référence):

 people.person.length(); // nombre de balise person
 people.person[0]; // correpond à la première balise person

On peut donc parcourir facilement les éléments : ceux ci sont stockés dans des propriétés d'un objet, dont les noms reprennent les noms des éléments.

Pour accéder à un attribut (ici id), grâce au nouvel élement syntaxique "@" :

  people.person[0].@id // renvoi à 1

On peut bien sûr modifier un attribut :

  people.person[0].@id = 47

On peut effectuer des interrogations. Par exemple avoir la liste des balises <person> qui ont un attribut id=47 :

 people.person.(@id=='47')

Ou alors celles qui ont une balise fille <name> dont le contenu est Moe

 people.person.(name=='Moe')

Etc..

Utilisation dans les pages HTML

Pour des raisons de compatibilité dans les autres pages HTML, E4X est désactivé par défaut dans les pages HTML distantes. On ne peut pas par exemple faire :

 var people = <people>
        <person id="1">
             <name>Moe</name>
       </person>
       <person id="2">
             <name>Larry</name>
       </person>
    </people>;

Cela poserait en effet des problèmes (vu que la plupart des scripts sont enfermés dans un commentaire HTML).

Il y a alors deux solutions pour pouvoir utiliser pleinement E4X :

  1. déclarer le script non pas dans un <script type="text/javascript"> mais dans un <script type="text/javascript; e4x=1">. (toutefois le script ne pourra peut être pas fonctionner dans d'autres navigateurs)
  2. utiliser plutôt la syntaxe :
 var people = new XML('<people><person id="1">...');

Dans les extensions, que ce soit à partir de fichier XUL ou HTML, E4X est activé.

E4X <-> DOM

Actuellement, il n'est pas possible de passer directement de E4X à DOM et vice-versa. Ce problème est d'ailleurs répèrtorié dans le bug 270553.

Il faut donc transformer les objets XML e4x en chaîne et utiliser les objets DOMParser pour obtenir l'équivalent DOM, ou serialiser un objet DOM pour pouvoir l'utiliser avec E4X. Ce n'est pas terrible mais c'est la meilleur solution actuellement.

Voir des exemples sur le forum.

Ressources


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.