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.
- Per ulteriori informazioni su XPath, consulta la pagina w3schools.com/xml/xpath
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 id
Formula 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:
- SERVIZIO.WEB(URI) ottiene del contenuto web da un URI.
- URI: il testo URI del servizio web, ottiene del contenuto web da un URI.
- 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
- autore: Totò Fiandaca
- issue: #50 fornitore ricetta _Andrea Borruso
- ingredienti: QGIS, yq, xmlstarlet, XPATH, Miller
- ricetta è raggiungibile qui
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.