ToolDeck

Tester XPath

Testa espressioni XPath contro XML e visualizza tutti i nodi corrispondenti

Prova un esempio

Input XML

Esegue in locale · Sicuro per incollare segreti

Cos'è XPath?

XPath (XML Path Language) è un linguaggio di query per selezionare nodi da un documento XML. Definito dal W3C come parte dello standard XSLT, XPath tratta un documento XML come un albero di nodi e fornisce una sintassi basata su percorsi per navigare quell'albero. Un'espressione XPath come //book[@category="fiction"]/title seleziona ogni elemento title all'interno di un elemento book il cui attributo category è uguale a "fiction". XPath 1.0, la versione supportata da tutti i principali browser e dalla maggior parte delle librerie XML, è stata pubblicata come W3C Recommendation nel 1999 e rimane la versione più diffusa.

Le espressioni XPath restituiscono uno di quattro tipi di risultato: node set, stringhe, numeri o booleani. Un node set è il risultato più comune e contiene zero o più nodi XML (elementi, attributi, nodi di testo, commenti o istruzioni di elaborazione). I risultati stringa, numero e booleano provengono da funzioni XPath come count(), sum(), contains() e da confronti booleani. Questo sistema di tipi rende XPath adatto sia all'estrazione di dati che alla scrittura di logica condizionale nei fogli di stile XSLT e nelle asserzioni degli XML Schema.

Le espressioni della versione 1.0 funzionano ovunque: document.evaluate() in JavaScript, lxml e ElementTree in Python, javax.xml.xpath in Java, DOMXPath in PHP e strumenti da riga di comando come xmllint. Le versioni 2.0 e 3.1 aggiungono sistemi di tipi e funzioni più ricchi ma richiedono engine dedicati come Saxon. Usa la versione 1.0 per impostazione predefinita. Passa alla 2.0 o 3.1 solo quando hai bisogno di sequenze, espressioni regolari o funzioni di ordine superiore — e accetta la dipendenza da Saxon o BaseX.

Perché usare un Tester XPath online?

Scrivere espressioni corrette richiede di comprendere la struttura del documento e di testare con dati reali. Lo strumento ti offre un ambiente interattivo per iterare sulle espressioni senza dover configurare un progetto o scrivere codice boilerplate.

Testa le espressioni istantaneamente
Incolla il tuo XML, digita un'espressione e visualizza i nodi corrispondenti in tempo reale. Nessun passaggio di compilazione, nessun REPL da configurare, nessuna dipendenza da installare.
🔒
Elaborazione privacy-first
Il parsing XML e la valutazione delle query avvengono interamente nel browser tramite le API native DOMParser e document.evaluate(). I tuoi dati XML non lasciano mai la tua macchina.
🔍
Debug di query complesse passo dopo passo
Scomponi le espressioni lunghe testando ogni asse e predicato singolarmente. Osserva esattamente quali nodi corrispondono a ogni passo per isolare gli errori.
📋
Copia i risultati per la documentazione
Copia i nodi corrispondenti o i risultati scalari con un clic. Utile per incollare in segnalazioni di bug, asserzioni di test o script di estrazione dati.

Casi d'uso del Tester XPath

Sviluppatore frontend
Testa i selettori XPath per la manipolazione di SVG o la configurazione basata su XML prima di incorporarli nel codice JavaScript che chiama document.evaluate().
Ingegnere backend
Valida le query su risposte SOAP o payload XML API prima di scrivere la logica di estrazione in Python, Java o Go.
DevOps / Infrastruttura
Interroga file di configurazione XML (Maven pom.xml, Spring beans, configurazioni CI pipeline) per estrarre versioni di dipendenze o verificare impostazioni senza modificare i file.
QA / Test automation
Crea e verifica i localizzatori XPath per Selenium o Playwright prima di aggiungerli agli script di test. Testa casi limite come attributi mancanti o prefissi di namespace.
Ingegnere dei dati
Prototipa query per feed di dati XML (RSS, Atom, report finanziari XBRL) prima di integrarle nelle pipeline ETL.
Studente / principiante
Sperimenta con assi, predicati e funzioni XPath usando XML di esempio. Visualizza i risultati immediatamente per sviluppare l'intuizione sui pattern di navigazione degli alberi.

Riferimento agli assi XPath

Un asse definisce la direzione di navigazione rispetto al nodo corrente (contesto). La sintassi completa è asse::node-test[predicato], anche se la maggior parte degli sviluppatori usa ogni giorno le forme abbreviate (//, @, ..). Questa tabella elenca tutti gli assi 1.0 con esempi pratici.

AsseEsempioDescrizione
childchild::bookDirect children named "book"
descendantdescendant::titleAll "title" elements at any depth
parentparent::*The parent of the current node
ancestorancestor::catalogAll ancestors named "catalog"
following-siblingfollowing-sibling::bookSiblings after the current node
preceding-siblingpreceding-sibling::bookSiblings before the current node
attributeattribute::langThe "lang" attribute of the node
selfself::bookThe current node if it is "book"
descendant-or-self//titleShorthand: any "title" in the tree
ancestor-or-selfancestor-or-self::*Current node plus all ancestors

Funzioni XPath 1.0

Il linguaggio definisce 27 funzioni integrate in quattro categorie: node set, stringa, numero e booleano. Queste sono le funzioni che userai più spesso quando scrivi query. Tutte sono supportate da questo tester e da ogni implementazione conforme.

FunzioneCategoriaDescrizione
text()Node testSelects text content of a node
position()NumericReturns 1-based position in node set
last()NumericReturns size of current node set
count()NumericCounts nodes: count(//book)
contains()Stringcontains(@class, "active") — substring match
starts-with()Stringstarts-with(title, "The") — prefix match
normalize-space()StringStrips leading/trailing whitespace
string-length()NumericReturns character count of a string
sum()Numericsum(//price) — totals numeric values
not()Booleannot(@disabled) — negation
name()StringReturns element or attribute name

Esempi di codice

Questi esempi mostrano come valutare le espressioni a livello programmatico. Ogni frammento usa la stessa struttura catalog.xml in modo da poter confrontare le differenze di API tra i linguaggi.

JavaScript (browser)
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.98
Python (lxml)
from 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)  # → True
Java (javax.xml.xpath)
import 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
CLI (xmllint)
# 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

Domande frequenti

Qual è la differenza tra XPath 1.0 e XPath 3.1?
La versione 1.0 ha quattro tipi di dati (node set, stringa, numero, booleano) e 27 funzioni. La versione 3.1 aggiunge sequenze, mappe, array, tipi data/ora, espressioni regolari, funzioni di ordine superiore e supporto JSON. I browser e la maggior parte delle librerie standard implementano solo la versione 1.0. La versione 3.1 richiede un engine dedicato come Saxon.
Come seleziono i nodi con un valore di attributo specifico?
Usa un predicato con la scorciatoia @ per l'asse attributo. Ad esempio, //book[@category="fiction"] seleziona tutti gli elementi book in cui l'attributo category è uguale a "fiction". Puoi combinare più predicati: //book[@category="fiction"][@year > 2000].
Perché la mia XPath non restituisce risultati anche se l'XML contiene elementi corrispondenti?
La causa più comune sono i namespace XML. Se il tuo XML dichiara un namespace predefinito (xmlns="..."), gli elementi appartengono a quel namespace anche senza prefisso. Nella versione 1.0, devi registrare il namespace e usare un prefisso nell'espressione. In JavaScript nel browser, passa un namespace resolver come terzo argomento a document.evaluate().
XPath può modificare il contenuto XML?
No. È un linguaggio di query in sola lettura. Seleziona e valuta i nodi, ma non può inserire, eliminare o aggiornarli. Per modificare XML, usa trasformazioni XSLT, metodi di manipolazione DOM o una libreria come lxml di Python che fornisce API separate per la modifica.
Cosa significa il doppio slash (//) in XPath?
Il doppio slash è la scorciatoia per l'asse descendant-or-self. L'espressione //title significa "seleziona tutti gli elementi title ovunque nell'albero del documento, a qualsiasi profondità". È equivalente alla forma estesa /descendant-or-self::node()/title. Usare // all'inizio di un'espressione cerca nell'intero documento; usarlo a metà percorso (come /catalog//title) cerca i discendenti di un nodo specifico.
Come seleziono il contenuto testuale invece del nodo elemento?
Aggiungi /text() alla tua espressione. Ad esempio, //book/title/text() restituisce il contenuto testuale di ogni elemento title come nodo stringa, anziché il nodo elemento stesso. Nel codice puoi anche accedere a .textContent sul nodo elemento restituito senza usare text().
XPath è più veloce dei selettori CSS per interrogare XML?
I selettori CSS sono ottimizzati per HTML e la navigazione del DOM nei browser. XPath è più espressivo: supporta la navigazione verso i genitori, gli assi dei sibling, predicati numerici e funzioni integrate che i selettori CSS non possono esprimere. Per HTML, i selettori CSS (querySelector) sono tipicamente più veloci. Per XML, la maggior parte delle librerie server-side espone solo XPath — i selettori CSS non sono affatto un'opzione.