Lavorare con gli XML da linea di comando. xmllint

xmllint é uno strumento che ci permette di elaborare, navigare, validare, etc dei file di XML tramite la linea di comando.

Questo strumento é disponibile sui sistemi operativi Linux/Unix installando la libreria

  • libxml2

e su windows mediante cygwin installando i pacchetti:

  • libxml
  • libxslt

Per esempio per creare automaticamente un xml per i nostri scopi ci basta usare il comando:

xmllint --auto

che genereá il seguente output su stdout (ovviamente potete ridirezionarlo su di un file):

<?xml version="1.0"?>
<info>abc</info>


Ovviamente possiamo generare anche un output in formato html utilizzando:

xmllint --auto --htmlout

E in questo causo si avrá l’output del –auto all’interno dei tag html, con l’aggiunta anche del doctype.

Una delle principali comoditá di xmllint a mio avviso  é la presenza di una shell interna grazie alla quale possiamo lanciare i comandi per lavorare con il nostro file xml. Il comando per lanciarla é:

xmllint --shell myXML.xml

Dove myXML é il file xml che vogliamo analizzare. Una volta lanciato questo comando, ci troveremo all’interno della shell del programma:

/ >

Nel caso si vuole lavorare con un file html invece dobbiamo aggiungere il parametro: –html:

xmllint --html --shell myXML.xml

Per avere la lista completa dei comandi disponibili possiamo utilizzare il comando help. In questo articolo ne vedremo solo alcuni. Una delle comoditá di questa shell é avere una somiglianza con i comandi classici di unix, quindi per cambiare nodo si usa cd, per vedere gli oggetti ls, etc.

Il primo comando ovviamente é cd, che come possiamo immaginare ci permette di navigare all’interno della struttura del documento, la sintassi come possiamo prevedere é:

  • cd path
  • cd xpath – Per esempio
    cd //Item[@name="itemname"]

    ci posiziona all’interno del nodo Item che ha come attributo name.

E cd senza argomenti ci riporta alla root del documento. Per sapere in ogni momento il path ove in cui ci troviamo si puo usare pwd.

Quindi se per esempio vogliamo avere la lista degli oggetti contenuti nel nodo corrente ( o in un path specifico) possiamo usare il comando ls. Vediamo alcuni modi per utilizzarlo

  • ls  ci restituisce il contenuto del nodo corrente
  • ls //item Ci restituisce i vari nodi contenuti all’interno di quello  di nome item nel documento
  • ls //xpath  – Per esempio
    ls//Item[@name="itemname"]

    ci mostra i vari nodi contenuti all’interno del nodo Item che ha come attributo name.

Mentre se usiamo il comando dir possiamo ottenere informazioni utili sulla struttura del documento.

Per esempio se ci troviamo nella root e diamo il comando dir l’output é il seguente:

/ > dir
DOCUMENT
version=1.0
encoding=utf-8
URL=menu.xml
standalone=true
namespace xml href=http://www.w3.org/XML/1998/namespace

Mentre se lo facciamo all’interno di un nodo avremo un output simile al seguente:

Item > dir
ELEMENT Item
 ATTRIBUTE name
 TEXT
 content=topic#424

Dove come vediamo viene descritta la struttura e gli elementi costitutivi di quel nodo.

Ovviamente possiamo anche usare il comando dir seguito da un path.

Ora se vogliamo vedere il contenuto di un nodo possiamo usare il comando cat, che senza argomenti ci mostra il contenuto. Ecco la stinassi:

  • cat – Senza argomenti mo0stra il contenuto del nodo corrente
  • cat //xpath – Per sempio
    cat //Item[@name="itemname"]

    ci mostra il contenuto del nodo item con attributo itemname.

Un altro comando utile per testare i nostri xpath é appunto il comando xpath, con la seguente sintassi:

xpath expr

questo comando controlla la validitá di un espressione xpaht, e se trova risultati corrispondenti ci mostra gli oggetti trovati:

Object is a Node Set :
Set contains 1 nodes:
1 ELEMENT Item
 ATTRIBUTE name
 TEXT
 content=topic#424

Mediante il comando validate possiamo anche validare il nostro xml.

Questo articolo vuole essere solo una breve introduzione all’utilizzo di questo comodo strumento, quindi non vi arrabbiate se non contiene tutto quello che cercate :). Per oggi mi fermo qui, poi non é detto che non troni sull´argomento in futuro.

 

Leave a Reply

Your email address will not be published. Required fields are marked *