Testeur XPath
Testez des expressions XPath sur du XML et visualisez tous les nœuds correspondants
Entrée XML
Qu'est-ce que XPath ?
XPath (XML Path Language) est un langage de requête permettant de sélectionner des nœuds dans un document XML. Défini par le W3C dans le cadre du standard XSLT, XPath traite un document XML comme un arbre de nœuds et fournit une syntaxe basée sur les chemins pour naviguer dans cet arbre. Une expression XPath comme //book[@category="fiction"]/title sélectionne tous les éléments title contenus dans un élément book dont l'attribut category est égal à "fiction". XPath 1.0, la version prise en charge par tous les navigateurs majeurs et la plupart des bibliothèques XML, a été publiée en tant que recommandation W3C en 1999 et reste la version la plus largement déployée.
Les expressions XPath retournent l'un des quatre types de résultats suivants : ensembles de nœuds, chaînes, nombres ou booléens. Un ensemble de nœuds est le résultat le plus courant et contient zéro ou plusieurs nœuds XML (éléments, attributs, nœuds texte, commentaires ou instructions de traitement). Les résultats de type chaîne, nombre et booléen proviennent des fonctions XPath comme count(), sum(), contains() et des comparaisons booléennes. Ce système de types rend XPath adapté à la fois à l'extraction de données et à l'écriture de logique conditionnelle dans les feuilles de style XSLT et les assertions XML Schema.
Les expressions de la version 1.0 fonctionnent partout : document.evaluate() en JavaScript, lxml et ElementTree en Python, javax.xml.xpath en Java, DOMXPath en PHP, et les outils en ligne de commande comme xmllint. Les versions 2.0 et 3.1 ajoutent des systèmes de types plus riches et des fonctions supplémentaires, mais nécessitent des moteurs dédiés comme Saxon. Utilisez la version 1.0 par défaut. Optez pour la version 2.0 ou 3.1 uniquement si vous avez besoin de séquences, d'expressions régulières ou de fonctions d'ordre supérieur — et acceptez la dépendance envers Saxon ou BaseX.
Pourquoi utiliser un testeur XPath en ligne ?
Écrire des expressions correctes requiert de comprendre la structure du document et de les tester sur des données réelles. L'outil offre un environnement interactif pour itérer sur les expressions sans avoir à configurer un projet ou écrire du code d'initialisation.
Cas d'usage du testeur XPath
Référence des axes XPath
Un axe définit la direction de navigation par rapport au nœud courant (contexte). La syntaxe complète est axis::node-test[predicate], bien que la plupart des développeurs utilisent quotidiennement les formes abrégées (//, @, ..). Ce tableau liste tous les axes de la version 1.0 avec des exemples pratiques.
| Axe | Exemple | Description |
|---|---|---|
| child | child::book | Direct children named "book" |
| descendant | descendant::title | All "title" elements at any depth |
| parent | parent::* | The parent of the current node |
| ancestor | ancestor::catalog | All ancestors named "catalog" |
| following-sibling | following-sibling::book | Siblings after the current node |
| preceding-sibling | preceding-sibling::book | Siblings before the current node |
| attribute | attribute::lang | The "lang" attribute of the node |
| self | self::book | The current node if it is "book" |
| descendant-or-self | //title | Shorthand: any "title" in the tree |
| ancestor-or-self | ancestor-or-self::* | Current node plus all ancestors |
Fonctions XPath 1.0
Le langage définit 27 fonctions intégrées réparties en quatre catégories : ensemble de nœuds, chaîne, nombre et booléen. Ce sont les fonctions que vous utiliserez le plus souvent lors de l'écriture de requêtes. Toutes sont prises en charge par ce testeur et par toute implémentation conforme.
| Fonction | Catégorie | Description |
|---|---|---|
| text() | Node test | Selects text content of a node |
| position() | Numeric | Returns 1-based position in node set |
| last() | Numeric | Returns size of current node set |
| count() | Numeric | Counts nodes: count(//book) |
| contains() | String | contains(@class, "active") — substring match |
| starts-with() | String | starts-with(title, "The") — prefix match |
| normalize-space() | String | Strips leading/trailing whitespace |
| string-length() | Numeric | Returns character count of a string |
| sum() | Numeric | sum(//price) — totals numeric values |
| not() | Boolean | not(@disabled) — negation |
| name() | String | Returns element or attribute name |
Exemples de code
Ces exemples montrent comment évaluer des expressions par programmation. Chaque extrait utilise la même structure catalog.xml afin que vous puissiez comparer les différences d'API entre les langages.
const xml = `<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`
const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')
// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
console.log(node.textContent) // → "1984", "Dune"
node = result.iterateNext()
}
// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // → 20.98from lxml import etree
xml = """<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""
tree = etree.fromstring(xml.encode())
# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books) # → ['1984']
# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first) # → ['1984']
# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap) # → Trueimport javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;
var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));
var xpath = XPathFactory.newInstance().newXPath();
// Select node set
NodeList titles = (NodeList) xpath.evaluate(
"//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
System.out.println(titles.item(i).getTextContent());
// → "1984", "Dune"
}
// Evaluate to number
double total = (double) xpath.evaluate(
"sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // → 20.98# Select all book titles xmllint --xpath '//book/title/text()' catalog.xml # → 1984Dune # Select by attribute xmllint --xpath '//book[@id="2"]/title' catalog.xml # → <title>Dune</title> # Count nodes xmllint --xpath 'count(//book)' catalog.xml # → 2 # Using xmlstarlet for formatted output xmlstarlet sel -t -v '//book/title' -n catalog.xml # → 1984 # → Dune