Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Utilisation de XPath

 

XPath est un langage de conversion des éléments d'un document XML. C'est une recommandation du W3C (en).

Cet article décrit les interfaces de Mozilla qui exposent les fonctionnalités XPath au code JavaScript. Elles sont décrites dans DOM Level 3 XPath (en) (qui est une note du groupe de travail du W3C pour le moment).

Cet article n'a pas vocation à enseigner XPath. Si vous n'êtes pas familier avec cette technologie, veuillez vous référer au tutoriel XPath de W3Schools (en).

Fonction Wrapper

La fonction suivante peut être utilisée pour évaluer des expressions XPath de nœuds XML donnés. Le premier argument est un nœud DOM ou un objet de Document, le second est une chaîne définissant l'expression XPath.

// Évalue une expression XPath aExpression par rapport à un nœud DOM donné
// ou un objet de document (aNode), puis retourne les résultats en table
// Merci à wanderingstan at morethanwarm dot mail dot com pour le 
// travail initial.
function evaluateXPath(aNode, aExpr) {
  var xpe = new XPathEvaluator();
  var nsResolver = xpe.createNSResolver(aNode.ownerDocument == null ?
    aNode.documentElement : aNode.ownerDocument.documentElement);
  var result = xpe.evaluate(aExpr, aNode, nsResolver, 0, null);
  var found = [];
  var res;
  while (res = result.iterateNext())
    found.push(res);
  return found;
}

Cette fonction utilise new XPathEvaluator(). Ce constructeur est spécifique à Mozilla. Les scripts utilisés dans des pages Web qui seront affichées par les différents navigateurs existant devraient remplacer l'appel à new XPathEvaluator() avec le fragment de code suivant :

 // XPathEvaluator est implémenté sur les objets qui implémente Document
 var xpe = aNode.ownerDocument || aNode;

Dans ce cas, la création de XPathNSResolver peut être simplifiée avec :

 var nsResolver = xpe.createNSResolver(xpe.documentElement);

Notez cependant, que createNSResolver ne doit être utilisé que si vous êtes sûr que les préfixes de l'espace de noms correspondent à ceux du document « interrogé ». Autrement, vous devrez fournir votre propre implémentation de XPathNSResolver.

Si vous utilisez XMLHttpRequest pour un fichier XML local ou distant dans un arbre DOM (comme décrit dans Analyser et sérialiser XML), le premier argument de evaluateXPath() devrait être req.responseXML.

Exemple d'utilisation

Supposons que l'on ait le document XML suivant (voir également Création d'un arbre DOM et Analyser et sérialiser XML):

<?xml version="1.0"?>
<people>
  <person first-name="eric" middle-initial="H" last-name="jung">
    <address street="321 south st" city="denver" state="co" country="usa"/>
    <address street="123 main st" city="arlington" state="ma" country="usa"/>
  </person>

  <person first-name="jed" last-name="brown">
    <address street="321 north st" city="atlanta" state="ga" country="usa"/>
    <address street="123 west st" city="seattle" state="wa" country="usa"/>
    <address street="321 south avenue" city="denver" state="co" country="usa"/>
  </person>
</people>

Vous pouvez « interroger » le document à l'aide d'expressions XPath. Bien que parcourir l'arbre DOM donnera des résultats similaires, l'utilisation d'expressions XPath est bien plus rapide et puissante. Si vous avez la possiblité d'utiliser des attributs id, document.getElementById() est encore puissant, mais toujours moins que XPath. Voici quelques exemples.

// affiche le nom de famille de toutes les personnes du document
var results = evaluateXPath(people, "//person/@last-name");
for (var i in results)
  alert("la nom de famille de la personne #" + i + "est" + results[i].value);

// recupère le nœud de la seconde personne
results = evaluateXPath(people, "/people/person[2]");

// récupère les nœuds de toutes les personnes vivant à Denver
results = evaluateXPath(people, "//person[address/@city='denver']");

// Récupère les adresses contenant "south" dans le nom de voie
results = evaluateXPath(people,  "//address[contains(@street, 'south')]");
alert(results.length);

Ressources

Interwiki Language Links

 

 

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : kmaglione, Mgjbot, Elethiomel, Fredchat
 Dernière mise à jour par : kmaglione,