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
- XPath
- Visualiseur XPath pour Mozilla et Firefox (en)
- Tutoriel XPath (en)
- Forum de discussion sur l'utilisation de XPath (en)
- Utiliser l'interface JavaScript de Mozilla avec XPath (en) - brouillon d'un tutoriel sur l'utilisation de XPath avec JavaScript
Interwiki Language Links