Imparare ad analizzare XML è spesso considerato un'impresa complessa, ma non deve esserlo. XML è altamente e rigorosamente strutturato, quindi è relativamente prevedibile. Ci sono anche molti strumenti disponibili per rendere il lavoro gestibile.
Una delle mie utilità XML preferite è XMLStarlet, un toolkit XML per il tuo terminale. Con XMLStarlet, puoi convalidare, analizzare, modificare, formattare e trasformare i dati XML. XMLStarlet è un comando relativamente minimo, ma la navigazione in XML è piena di potenzialità, quindi questo articolo mostra come utilizzarlo per interrogare dati XML.
Installa
XMLStarlet è installato per impostazione predefinita su CentOS, Fedora e molte altre moderne distribuzioni Linux, quindi apri un terminale e digita xmlstarlet
per accedervi. Se XMLStarlet non è già installato, il tuo sistema operativo propone di installarlo per te.
In alternativa, puoi installare xmlstarlet
comando dal tuo gestore di pacchetti:
$ sudo dnf install xmlstarlet
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Su macOS, usa MacPorts o Homebrew. Su Windows, usa Chocolatey.
Se tutto il resto fallisce, puoi installarlo manualmente dal codice sorgente su Sourceforge.
Analisi XML con XMLStarlet
Esistono molti strumenti progettati per aiutare ad analizzare e trasformare i dati XML, incluse librerie software che ti consentono di scrivere il tuo parser e comandi complessi come fop
e xsltproc
. Tuttavia, a volte non è necessario elaborare i dati XML; hai solo bisogno di un modo conveniente per estrarre dati importanti, aggiornarli o semplicemente convalidarli. Per le interazioni XML spontanee, utilizzo xmlstarlet
, una classica applicazione in stile "coltellino svizzero" che esegue le attività XML più comuni. Puoi vedere cosa ha da offrire eseguendo il comando insieme a --help
opzione:
$ xmlstarlet --help
Usage: xmlstarlet [<options>] <command> [<cmd-options>]
where <command> is one of:
ed (or edit) - Edit/Update XML document(s)
sel (or select) - Select data or query XML document(s) (XPATH, etc)
tr (or transform) - Transform XML document(s) using XSLT
val (or validate) - Validate XML document(s) (well-formed/DTD/XSD/RelaxNG)
fo (or format) - Format XML document(s)
el (or elements) - Display element structure of XML document
c14n (or canonic) - XML canonicalization
ls (or list) - List directory as XML
[...]
Puoi ottenere ulteriore aiuto aggiungendo --help
alla fine di uno qualsiasi di questi sottocomandi:
$ xmlstarlet sel --help
-Q or --quiet - do not write anything to standard output.
-C or --comp - display generated XSLT
-R or --root - print root element <xsl-select>
-T or --text - output is text (default is XML)
-I or --indent - indent output
[...]
Selezione dei dati con sel
Puoi visualizzare i dati in XML con xmlstarlet select
(sel
in breve) comando. Ecco un semplice documento XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xml>
<os>
<linux>
<distribution>
<name>Fedora</name>
<release>7</release>
<codename>Moonshine</codename>
<spins>
<name>Live</name>
<name>Fedora</name>
<name>Everything</name>
</spins>
</distribution>
<distribution>
<name>Fedora Core</name>
<release>6</release>
<codename>Zod</codename>
<spins></spins>
</distribution>
</linux>
</os>
</xml>
Quando si cercano dati in un file XML, il primo compito è concentrarsi sul nodo che si desidera esplorare. Se conosci il percorso del nodo, specifica il percorso completo con il --value-of
opzione. Prima inizi a esplorare l'albero DOM (Document Object Model), più informazioni visualizzi:
$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution \
--nl myfile.xml
Fedora
7
Moonshine
Live
Fedora
Everything
Fedora Core
6
Zod
Il --nl
sta per "nuova riga" e inserisce abbondanti quantità di spazi bianchi per garantire che il prompt del terminale riceva una nuova riga dopo che i risultati sono stati inseriti. Ho rimosso parte dello spazio in eccesso nell'output di esempio.
Restringi la tua attenzione scendendo ulteriormente nell'albero DOM:
$ xmlstarlet select --template \
--value-of /xml/os/linux/distribution/name \
--nl myfile.xml
Fedora
Fedora Core
Selezioni condizionali
Uno degli strumenti più potenti per la navigazione e l'analisi di XML si chiama XPath. Governa la sintassi utilizzata nelle ricerche XML e richiama le funzioni dalle librerie XML. XMLStarlet comprende le espressioni XPath, quindi puoi rendere condizionale la tua selezione con una funzione XPath. XPath dispone di una vasta gamma di funzioni ed è documentato in dettaglio dal W3C, ma trovo più concisa la documentazione di Mozilla XPath.
Puoi usare le parentesi quadre come funzione di test, confrontando il contenuto di un elemento con un valore. Ecco un test per il valore di <name>
elemento, che restituisce il numero di versione associato solo a una corrispondenza specifica.
Immagina per un momento che il file XML di esempio contenga tutte le versioni di Fedora che iniziano con 1. Per visualizzare tutti i numeri di versione associati al vecchio nome "Fedora Core" (il progetto ha eliminato "Core" dal nome dalla versione 7 in poi):
$ xmlstarlet sel --template \
--value-of '/xml/os/linux/distribution[name = "Fedora Core"]/release' \
--nl myfile.xml
6
5
4
3
2
1
Puoi visualizzare tutti i nomi in codice anche per quelle versioni, modificando il --value-of
percorso a /xml/os/linux/distribution[name = "Fedora Core"]/codename
.
Corrispondenza di percorsi e acquisizione di valori
Un vantaggio della visualizzazione dei tag XML come nodi è che una volta trovato il nodo, puoi considerarlo come la tua attuale "directory" di dati. Non è davvero una directory, almeno non nel senso del filesystem, ma è una raccolta di dati che puoi interrogare. Per aiutarti a mantenere separati la tua destinazione e i dati "al suo interno", XMLStarlet distingue tra ciò che stai cercando di abbinare con --match
opzione e il valore dei dati desiderati con un --value-of
opzione.
Supponiamo di sapere che il <spin>
nodo contiene diversi elementi. Questo lo rende la tua destinazione. Una volta che sei lì, puoi usare --value-of
per specificare per quale elemento desideri un valore. Per guardare tutti gli elementi, usa un punto (.
) per rappresentare la tua posizione attuale:
$ xmlstarlet sel --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' --nl myfile.xml \
Live
Fedora
Everything
Come per la navigazione nel DOM, puoi utilizzare le espressioni XPath per limitare l'ambito dei dati restituiti. In questo esempio, utilizzo last()
funzione per recuperare solo l'ultimo elemento nel spin
nodo:
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[last()]' --nl myfile.xml
Everything
In questo esempio, utilizzo position()
funzione per selezionare un elemento specifico nel spin
nodo:
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '*[position() = 2]' --nl myfile.xml
Fedora
Il --match
e --value-of
le opzioni possono sovrapporsi, quindi sta a te decidere come usarle insieme. Queste due espressioni, nel caso dell'XML di esempio, fanno la stessa cosa:
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution/spin' \
--value-of '.' \
--nl myfile.xml
Live
Fedora
Everything
$ xmlstarlet select --template \
--match '/xml/os/linux/distribution' \
--value-of 'spin' \
--nl myfile.xml
Live
Fedora
Everything
Mettersi a proprio agio con XML
XML può sembrare a volte troppo dettagliato e ingombrante, ma gli strumenti creati per interagire con esso mi sorprendono costantemente. Se stai cercando di sfruttare XML, XMLStarlet potrebbe essere un buon punto di ingresso. La prossima volta che stai per aprire un file XML per esaminare i dati strutturati, prova a utilizzare XMLStarlet e verifica se puoi invece interrogare quei dati. Più ti senti a tuo agio con XML, meglio può servirti come formato di dati robusto e flessibile.