In questo articolo vedremo come effettuare il parsing di una sitemap di Google con Go.
Una sitemap di Google è un documento XML il cui elemento radice è l'elemento urlset
. All'interno di questo elemento sono contenuti gli elementi url
. Ciascuno di questi elementi contiene le informazioni relative agli URL presenti in un sito web, racchiuse nei seguenti elementi discendenti:
loc
: l'URL della pagina weblastmod
: la data dell'ultima modificachangefreq
: l'intervallo in cui viene effettuata una modificapriority
: un numero che rappresenta la priorità da assegnare all'URL.
Come per JSON, in Go occorre creare delle struct che rappresentano la struttura del documento XML. Per questo scopo si utilizza il package encoding/xml
che userà le seguenti struct:
package main
import "encoding/xml"
type Sitemap struct {
XMLName xml.Name `xml:"urlset"`
Xmlns string `xml:"xmlns,attr"`
URLs []SitemapURL `xml:"url"`
}
type SitemapURL struct {
XMLName xml.Name `xml:"url"`
Loc string `xml:"loc"`
Lastmod string `xml:"lastmod"`
Changefreq string `xml:"changefreq"`
Priority string `xml:"priority"`
}
Un elemento genitore viene contrassegnato con il tipo xml.Name
. Come per JSON, anche in questo caso è necessario usare i tag per far corrispondere al campo della struct l'elemento del documento XML. Ad esempio il tag xml:"loc"
fa corrispondere il campo Loc
all'elemento XML <loc>
presente nel documento.
Vogliamo reperire quindi una sitemap tramite una richiesta HTTP GET ed effettuarne il parsing. Possiamo scrivere il seguente codice:
package main
import (
"encoding/xml"
"fmt"
"net/http"
"log"
"io"
)
type Sitemap struct {
XMLName xml.Name `xml:"urlset"`
Xmlns string `xml:"xmlns,attr"`
URLs []SitemapURL `xml:"url"`
}
type SitemapURL struct {
XMLName xml.Name `xml:"url"`
Loc string `xml:"loc"`
Lastmod string `xml:"lastmod"`
Changefreq string `xml:"changefreq"`
Priority string `xml:"priority"`
}
func main() {
sitemapURL := "https://site.tld/sitemap.xml"
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
body, err := io.ReadAll(res.Body)
defer res.Body.Close()
if res.StatusCode > 299 {
log.Fatal(res.StatusCode)
}
if err != nil {
log.Fatal(err)
}
var s Sitemap
xml.Unmarshal(body, &s)
for _, url := range s.URLs {
fmt.Println(url.Loc)
}
}
xml.Unmarshal
accetta come input i byte del documento XML reperito tramite la richiesta GET ed utilizza le struct che abbiamo definito prima per popolare l'elenco di elementi SitemapURL
contenuti nella struct principale Sitemap
.
In conclusione, il parsing di una sitemap di Google con Go si rivela essere relativamente semplice e ci permette di progettare ad esempio applicazioni dalla riga di comando che sfruttino questa caratteristica.