Estrarre dati da un file XML con Google sheet (XPATH)

Estrarre dati da un file XML con Google sheet (XPATH).

A cura di Gianni Vitrano  | issue #84 | guida/e Andrea Borruso


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.

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

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

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


URL della pagina da esaminare per l’esempio: tema.xml (server ftp)

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. (cit) 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

Ultima modifica 19/07/2020: close #50 (a1365d8)