Estrarre dati da un file XML con Google sheet e XPath

QGIS popolare un campo della tabella attributi con i colori dello stile categorizzato usato

Caso d”uso: il file di tematizzazione di un layer (in QGIS) è un file XML, alcune volte è necessario reperire i codici colore (in rgba) direttamente dal file di tematizzazione: questa ricetta estrae i codici colori utilizzati e crea una tabella, in CSV, pronta per essere utilizzata in QGIS e messa in join con il layer in esame. (dalla ricetta di @Totò Fiandaca)

Per chi ha poca familiarità con bash e tutti gli ottimi applicativi Linux, usati nelle ricetta di Totò Fiandaca una valida alternativa/soluzione potrebbe essere l”utilizzo di Google sheet e XPath.

In questo caso il file xml deve essere prima caricato in un server remoto e poi richiamato con la funzione IMPORTXML.
N. B.: Il server remoto può essere un semplice server ftp o anche un repository Github

Qui il file sheet iniziale di esempio per l’importazione del file tema.xml e le relative query XPATH è scritto da Andrea Borruso

Prima di procedere, ricordiamoci prima i caricare i dati, di settare le impostazioni del foglio di lavoro, dal menu File, nella scheda Generale selezionare Regno Unito per le Impostazioni internazionali e spuntare Usa sempre nomi di funzioni inglesi, nella scheda Calcolo selezionare A ogni modifica nelle impostazioni del Ricalcolo.

N.B. La sintassi della funzione IMPORTXML dipende dalle impostazioni del impostazioni del foglio di lavoro

Esempio:

  • in italiano il separatore degli argomenti della formula è il ; (punto e virgola)
  • in inglese è la , (virgola)

Sintassi per foglio di lavoro in Italiano

=IMPORTXML(url; query_xpath)

Sintassi per foglio di lavoro in Inglese

=IMPORTXML(url, query_xpath)

Dove:

  • url – L”URL della pagina da esaminare, incluso il protocollo (ad esempio http://).
    • Il valore di url deve essere racchiuso tra virgolette o essere un riferimento a una cella che contiene il testo appropriato.
  • query_xpath – La query XPath da eseguire sui dati strutturati.

Esempio di utilizzo

=IMPORTXML("http://gbvitrano.it/clip/umap/tema.xml","//category/@symbol")

Restituisce informazioni del valore name (id regione) del gruppo category


Studiando la struttura del file xml si capisce quali espressioni XPath occorrono per estrarre i dati di nostro interesse. Nel caso specifico dobbiamo estrarre i Nomi delle Regioni il colore utilizzato per la tematizzazione e i relativi idFormula per estrarre la colonna name (id colore) del gruppo symbol

=IMPORTXML("http://gbvitrano.it/clip/umap/tema.xml","//symbols/symbol/@name")

Formula per estrarre la colonna colore del gruppo symbol

=IMPORTXML("http://gbvitrano.it/clip/umap/tema.xml","//symbols/symbol/layer/prop[@k='color']/@v")

Formula per estrarre la colonna label (nome regione) del gruppo category

=IMPORTXML("http://gbvitrano.it/clip/umap/tema.xml","//category/@value")
Formula per estrarre la colonna name (id regione) del gruppo category
=IMPORTXML("http://gbvitrano.it/clip/umap/tema.xml","//category/@symbol")

alla fine si fa il JOIN con VLOOKUP (cit. Andrea Borruso) per ottenere il colore utilizzato in ogni Regione.

=VLOOKUP(D2,A:B,2,FALSE)

Ottenuto il file CSV/TSV e importato in QGIS, con un semplice JOIN (tra il layer di partenza e il file CSV/TSV  è possibile aggiungere la colonna ‘rgba‘ alla tabella attributi del layer tematizzato. La nuova colonna può essere utile per tematizzare il file utilizzando la sovrascrittura definita dai dati. (Esempio)


Soluzione usando Libreoffice Calc, Excel

Utilizzando la funzione FILTRO.XML, che applica un”espressione XPath a un documento XML, si possono estrarre i dati ad file xml in remoto anche con LibreOffice Calc ed Excel.

FILTRO.XML(SERVIZIO.WEB(URI); espressione XPath)

Dove:

  1. SERVIZIO.WEB(URI) ottiene del contenuto web da un URI.
  2. URI: il testo URI del servizio web, ottiene del contenuto web da un URI.
  3. Espressione XPath (richiesta): stringa contenente un”espressione XPath valida.

descrizioni tratte dalla guida di libreoffice

Esempio di utilizzo

=FILTRO.XML(SERVIZIO.WEB("http://gbvitrano.it/clip/umap/tema.xml"); "//category/@symbol")

Restituisce informazioni del valore name (id regione) del gruppo category


Utility yq

Studiando il comando utilizzato da Andrea Borruso per estrarre i dati con l”utility yq, ci rendiamo conto che anche se scritta ovviamente in modo diverso, la query è sempre la stessa, il file tema.xml si trova il locale e la finstra bash è aperta direttamente nella cartella del file tema.xml

<tema.xml xq -r '.qgis["renderer-v2"].symbols.symbol[]|[.["@name"],.layer.prop[1]["@v"]]|@csv' >./idColori.csv

<tema.xml xq -r '.qgis["renderer-v2"].categories.category[]|[.["@symbol"],.["@value"]]|@csv' >./idRegioni.csv


Soluzione usando QGIS, yq, xmlstarlet, XPATH, Miller

Riferimenti:
issue: #50 fornitore ricetta Andrea Borruso
Ricetta su tansignari.opendatasicilia – Estrarre dati da un file XML
Blog post pigrecoinfinito di @totofiandaca

 

Grazie a @aborruso e @totofiandaca


T’ansignari e t’appeddiri!

Questa è una delle tante ricette che trovate su T’ansignari e t’appeddiri! un repository github di #opendatasicilia nato per mettere a fattore comune scambi di conoscenza/esperienza su questi temi: dati aperti, trasparenza, Linked Open Data, analisi e trasformazione di dati.


Disclaimer: Le informazioni visibili e condivise non comportano la visualizzazione di dati sensibili. Data la natura esclusivamente informativa degli elaborati grafici e dei testi riportati, questi non costituiscono atti ufficiali. Per accedere agli atti ufficiali si rinvia agli elaborati definitivi allegati alle specifiche deliberazioni.