GNU/Linux >> Linux Esercitazione >  >> Linux

Usa XMLStarlet per analizzare XML nel terminale Linux

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.


Linux
  1. Copia i file nel terminale Linux

  2. Rinominare un file nel terminale Linux

  3. Sposta i file nel terminale Linux

  4. Usa il terminale Linux per navigare nel tuo computer

  5. Usa il terminale Linux per vedere quali file sono sul tuo computer

Rilassati accanto al fuoco sul tuo terminale Linux

Come utilizzare il comando cronologia di Linux

Come utilizzare il comando xargs di Linux

Come utilizzare il terminale Linux in Android

Come analizzare o visualizzare il codice XML nella riga di comando di Linux

Uso del comando grep in Linux