Golang : Extraire les données d'un flux RSS

Golang : Extraire les données d’un flux RSS

Pour celles et ceux qui viendraient visualiser la syntaxe de Go, sachez que malgré sa syntaxe au premier abord déroutante, elle n’en est pas moins facile à appréhender et facile à comprendre après 2/3 heures de pratique. Pour ma part, j’ai dans un premier temps découvert simplement le langage Go (Golang) via mon dernier amour… Docker ! Par la suite, je suis allé voir un meetup traitant de ce sujet et après avoir travailler 1 heure sur un projet désormais au fin fond de mon GitLab, je me suis lancé sur le travail de deux projets, dont les problématiques de performance et de maintenabilité du code sont des points clés d’un projet viable.

Pour l’écriture de ce billet, j’ai extrait une problématique d’un de mes projets. À savoir que l’utilisation du langage est selon moi un grand atout, car ce langage récent est extrêmement facile à compiler et facilite l’utilisation de librairie externe… Quand cela est nécessaire car Go possède une panoplie de package bien sentis. En l’occurrence ici, le package encoding/xml.

L’exemple qui suit présente l’extraction de données depuis un RSS mais cette méthode peut-être facilement adaptée pour extraire un sitemap ou tout autre XML correctement construit.

Démonstration

Pour illustrer mon travail, j’ai pris le flux RSS donné en exemple sur la page Wikipédia.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version=”1.0” encoding=”UTF-8?>
<rss version=”2.0”>
<channel>
<title>Mon site</title>
<description>Ceci est un exemple de flux RSS 2.0</description>
<lastBuildDate>Sat, 07 Sep 2002 00:00:01 GMT</lastBuildDate>
<link>http://www.example.org</link>
<item>
<title>Actualité N°1</title>
<description>Ceci est ma première actualité</description>
<pubDate>Sat, 07 Sep 2002 00:00:01 GMT</pubDate>
<link>http://www.example.org/actu1</link>
</item>
<item>
<title>Actualité N°2</title>
<description>Ceci est ma seconde actualité</description>
<pubDate>Sat, 07 Sep 2002 00:00:01 GMT</pubDate>
<link>http://www.example.org/actu2</link>
</item>
</channel>
</rss>

Pour parser ce flux il ne faut pas plus de 45 lignes, package et import compris. Et voici le bébé :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package main
import (
"encoding/xml"
"io/ioutil"
"log"
"os"
)
type Item struct {
XMLName xml.Name `xml:"item"`
Description string `xml:"description"`
Link string `xml:"link"`
PubDate string `xml:"pubDate"`
Title string `xml:"title"`
}
type Rss struct {
XMLName xml.Name `xml:"rss"`
Items []Item `xml:"channel>item"`
}
func main() {
file, err := ioutil.ReadFile("/go/news.rss")
if err != nil {
log.Println(err)
return
}
v := Rss{}
err = xml.Unmarshal(file, &v)
if err != nil {
log.Println(err.Error())
os.Exit(1)
}
for _, item := range v.Items {
log.Println("Title: ", item.Title)
log.Println("Description: ", item.Description)
log.Println("Link: ", item.Link)
log.Println("PubDate: ", item.PubDate)
}
}

Dans ce code, on voit la définition des structures. Dans un premier temps, on lit le fichier news.rss qui contiendra le contenu de votre flux.

Résultat

Voici le résultat :

1
2
3
4
5
6
7
8
9
root@6c38532f4658:/go# go run main.go
2015/08/20 07:05:50 Title:  Actualité N°1
2015/08/20 07:05:50 Description:  Ceci est ma première actualité
2015/08/20 07:05:50 Link:  http://www.example.org/actu1
2015/08/20 07:05:50 PubDate:  Sat, 07 Sep 2002 00:00:01 GMT
2015/08/20 07:05:50 Title:  Actualité N°2
2015/08/20 07:05:50 Description:  Ceci est ma seconde actualité
2015/08/20 07:05:50 Link:  http://www.example.org/actu2
2015/08/20 07:05:50 PubDate:  Sat, 07 Sep 2002 00:00:01 GMT

Et voici l’opération réussie ! N’hésitez pas à répondre et à faire des retours si cet article peut être améliorer.