Comment interpréter une chaîne de caractères XUL ?

Écrit par Neil Deakin. Traduit par Alain B. (14/07/2005).
Page originale : http://www.xulplanet.com/tutorials/xulqa/q_parsexul.html xulplanet.com

Parfois, vous disposez d'une chaîne de caractères contenant du XUL, soit saisie par l'utilisateur, ou soit transmise par le serveur distant, que vous souhaitez interpréter comme du XUL et l'afficher. Dans ce cas, vous ne pouvez pas utiliser les méthodes d'insertion du DOM mais vous devez interpréter le contenu XUL.

Il y a plusieurs possibilités. Tout d'abord, si le XUL à interpréter contient un document entier, vous pouvez simplement le charger dans un élément iframe. Vous pouvez faire abstraction du cadre et utiliser les fonctions DOM pour récupérer des pièces du document XUL.

Une autre méthode mieux adaptée aux courts fragments de XUL consiste à utiliser l'objet DOMParser pour interpréter la chaîne XUL :


var xulString="<button label='Bonjour'
               xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'/>">

var parser=new DOMParser();
var resultDoc=parser.parseFromString(xulString,"text/xml");

document.appendChild(resultDoc.documentElement);

L'objet DOMParser interprète une chaîne d'un document entier, toutefois vous pouvez également l'utiliser pour interpréter n'importe quel fragment comme indiqué plus haut.

Vous devez vous assurer que vous déclarez les éléments avec un espace de nommage correct, sinon ils seront simplement traités comme des éléments XML. Comme les documents ne peuvent contenir qu'un seul noeud de niveau supérieur, si vous désirez interpréter plusieurs éléments, vous devrez les inclure dans un unique élément tel qu'une boîte. Vous pourrez ensuite utiliser des fonctions DOM pour n'extraire que les pièces dont vous aurez besoin. Lorsque vous travaillerez avec le document interprété, vous pourrez obtenir le noeud de niveau supérieur grâce à la propriété documentElement du document.

Voici un exemple qui permet la saisie d'un contenu XUL quelconque qui sera interprété et affiché :

Voir

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<window id="xulParser" title="Interpréteur XUL" align="start"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script>
function parseXUL()
{
  // obtenir le contenu du champ de saisie
  var xulData=document.getElementById("xulData").value;

  // vérifie que du contenu n'ait pas déjà été ajouté auparavant.
  // Dans ce cas, nous effaçons le contenu existant avant d'ajouter l'autre.
  var existBox=document.getElementById("dataBox");
  if (existBox) existBox.parentNode.removeChild(existBox);

  // encapsule le contenu dans une boîte. C'est nécessaire au cas
  // où l'utilisateur entre plusieurs noeuds de niveau supérieur.
  // Nous déclarons également l'espace de nommage afin que l'utilisateur
  // n'ait pas à le faire lui-même.
  xulData="<box id='dataBox' " +
          "xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'>" +
          xulData + "</box>";

  // crée un nouvel objet DOMParser et interprétre le contenu.
  // La fonction parseFromString prend deux arguments, la chaîne à interpréter
  // et le type de contenu. Actuellement, Mozilla ne supporte que HTML et XML
  // au travers de DOMParser, donc des fonctionnalités qui nécessiteraient
  // un document XUL tel que des gabarits ou des overlays ne fonctionneraient
  // pas avec cette méthode.
  var parser=new DOMParser();
  var resultDoc=parser.parseFromString(xulData,"text/xml");

  // si le noeud de niveau supérieur du document interprété se nomme
  // parsererror, cela signifie que le XML n'a pas été bien formé.
  if (resultDoc.documentElement.tagName == "parsererror")
    alert("Erreur d'interprétation");

  // si aucune erreur ne se produit, récupèrer la propriété
  // documentElement du document interprété et l'ajouter à la fin de la fenêtre.
  else document.documentElement.appendChild(resultDoc.documentElement);
}
  
</script>

<label value="Entrez du code XUL :"/>
<textbox id="xulData" multiline="true" rows="10" cols="60"/>
<button label="Interpréter" oncommand="parseXUL();"/>

</window>

Notez que l'emploi de DOMParser utilise simplement un interpréteur XML générique qui ne gère pas les gabarits ou les overlays et bien d'autres choses. Si vous devez gérer ces fonctionnalités, vous devrez utiliser un cadre iframe.


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.