Lecture de flux RSS – Episode 3
Dans les épisodes précédents, nous avons d’abord lu un flux RSS brut, puis nous avons extrait le titre de ce flux via une expression XPath. Nous allons améliorer l’ensemble en extrayant toutes les informations de l’en-tête du flux. Enfin presque toutes…
La classe VBA LecteurRSS
Pour mieux centraliser l’ensemble du code (et sans doute le rendre plus facile à faire évoluer), on ne va pas garder l’approche « module standard », cette fois. Au contraire, on va créer un module de classe. C’est un peu plus de code au début, pour une meilleure gestion ensuite !
- Dans Visual Basic Editor, cliquez sur le menu Insertion / Module de classe.
- Enregistrez votre module sous le nom
LecteurRSS
. C’est de cette manière qu’on crée un nouvel objetLecteurRSS
. - Recopiez le code suivant en début de module :
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 |
Option Compare Database Option Explicit ' ------------------------------ ' ATTRIBUTS DE LA CLASSE ' ------------------------------ Private m_strURL As String Private m_document As MSXML2.DOMDocument ' ------------------------------ ' PROPRIETES GENERALES ' ------------------------------ ' --- ' URL DU FLUX RSS ' --- Property Get URL() As String URL = m_strURL End Property Property Let URL(ByVal strURL As String) m_strURL = strURL End Property ' --- ' DOCUMENT XML LU ' --- Property Get XMLDocument() As MSXML2.DOMDocument Set XMLDocument = m_document End Property |
Property Get / End Property
définit une propriété de la classe, en lecture uniquement. Le bloc Property Let / End Property
définit une propriété en écriture. Il peut exister un bloc Property Let
et un bloc Property Get
portant le même nom (c’est le cas de la propriété URL
ci-dessus) : dans ce cas, on définit une propriété en lecture/écriture.Le premier rôle des propriétés est de donner un accès indirect à des variables privées de la classe, de manière à mieux contrôler cet accès.
Propriétés du flux
L’objectif principal de notre classe est de renvoyer des informations simples sur l’en-tête du flux : son titre, l’adresse du site, la description du flux, le copyright, etc. Toutes ces informations figurent dans le fichier XML, à l’intérieur de la balise channel
. Elles peuvent toutes être extraites de la même manière, par un chemin XPath du type : //channel/title
, //channel/link
, //channel/description
, etc.
Ces informations sont des propriétés du flux, elles seront donc traitées comme des propriétés de classe.
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 47 48 49 |
' --- ' TITRE DU FLUX ' --- Property Get Titre() As String Titre = LireNoeud("//channel/title") End Property ' --- ' LIEN DU FLUX ' --- Property Get Lien() As String Lien = LireNoeud("//channel/link") End Property ' --- ' DESCRIPTION DU FLUX ' --- Property Get Description() As String Description = LireNoeud("//channel/description") End Property ' --- ' LANGUE DU FLUX ' --- Property Get Langue() As String Langue = LireNoeud("//channel/language") End Property ' --- ' DATE DE PUBLICATION DU FLUX ' --- ' Note : la date est fournie dans son format brut. Property Get DatePublication() As String DatePublication = LireNoeud("//channel/pubDate") End Property ' --- ' COPYRIGHT DU FLUX ' --- Property Get Copyright() As String Copyright = LireNoeud("//channel/copyright") End Property ' --- ' GENERATEUR DU FLUX ' --- Property Get Generateur() As String Generateur = LireNoeud("//channel/generator") End Property |
Fonctions utiles
Si vous avez suivi le code ci-dessus, vous avez vu que les propriétés du flux font toutes appel à une fonction LireNoeud()
, en lui transmettant le chemin XPath à extraire. Il nous reste à ajouter cette fonction dans le module, ainsi que la fonction de lecture HTTP. Ajoutez encore ceci :
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 47 48 49 50 51 52 53 54 |
' --- ' LECTURE DU FLUX RSS ' --- ' La fonction renvoie le code de retour HTTP (200 = OK). ' Public Function LireFlux() As Long Dim http As MSXML2.ServerXMLHTTP Dim lngStatut As Long ' L'URL est-elle définie ? If m_strURL = "" Then MsgBox "URL non définie !", vbExclamation Exit Function End If ' Lecture du flux Set http = New MSXML2.ServerXMLHTTP http.Open "GET", m_strURL, False http.Send "" lngStatut = http.Status ' Si ok, on lit le document XML, If (lngStatut = 200) Then Set m_document = http.responseXML Else Set m_document = Nothing End If Set http = Nothing LireFlux = lngStatut End Function ' --- ' LECTURE D'UN NOEUD XML A PARTIR DE SON CHEMIN XPATH ' --- Private Function LireNoeud(ByVal strXPath As String) Dim nd As MSXML2.IXMLDOMNode Dim strValeur As String ' On ne fait rien si le document XML est vide If m_document Is Nothing Then LireNoeud = "" Exit Function End If ' Lire le noeud par son chemin XPath strValeur = "" Set nd = m_document.selectSingleNode(strXPath) If Not (nd Is Nothing) Then strValeur = nd.Text Set nd = Nothing ' Valeur de retour LireNoeud = strValeur End Function |
Le module de classe complet
Si vous avez manqué un copier/coller, voici le module de classe au complet (à droite, la vue de notre classe dans l’Explorateur d’objets) :
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
Option Compare Database Option Explicit ' ------------------------------ ' ATTRIBUTS DE LA CLASSE ' ------------------------------ Private m_strURL As String Private m_document As MSXML2.DOMDocument ' ------------------------------ ' PROPRIETES GENERALES ' ------------------------------ ' --- ' URL DU FLUX RSS ' --- Property Get URL() As String URL = m_strURL End Property Property Let URL(ByVal strURL As String) m_strURL = strURL End Property ' --- ' DOCUMENT XML LU ' --- Property Get XMLDocument() As MSXML2.DOMDocument Set XMLDocument = m_document End Property ' ------------------------------ ' PROPRIETES DU FLUX RSS ' ------------------------------ ' --- ' TITRE DU FLUX ' --- Property Get Titre() As String Titre = LireNoeud("//channel/title") End Property ' --- ' LIEN DU FLUX ' --- Property Get Lien() As String Lien = LireNoeud("//channel/link") End Property ' --- ' DESCRIPTION DU FLUX ' --- Property Get Description() As String Description = LireNoeud("//channel/description") End Property ' --- ' LANGUE DU FLUX ' --- Property Get Langue() As String Langue = LireNoeud("//channel/language") End Property ' --- ' DATE DE PUBLICATION DU FLUX ' --- ' Note : la date est fournie dans son format brut. Property Get DatePublication() As String DatePublication = LireNoeud("//channel/pubDate") End Property ' --- ' COPYRIGHT DU FLUX ' --- Property Get Copyright() As String Copyright = LireNoeud("//channel/copyright") End Property ' --- ' GENERATEUR DU FLUX ' --- Property Get Generateur() As String Gen erateur = LireNoeud("//channel/generator") End Property ' ------------------------------ ' FONCTIONS UTILITAIRES ' ------------------------------ ' --- ' LECTURE DU FLUX RSS ' --- ' La fonction renvoie le code de retour HTTP (200 = OK). ' Public Function LireFlux() As Long Dim http As MSXML2.ServerXMLHTTP Dim lngStatut As Long ' L'URL est-elle définie ? If m_strURL = "" Then MsgBox "URL non définie !", vbExclamation Exit Function End If ' Lecture du flux Set http = New MSXML2.ServerXMLHTTP http.Open "GET", m_strURL, False http.Send "" lngStatut = http.Status ' Si ok, on lit le document XML, If (lngStatut = 200) Then Set m_document = http.responseXML Else Set m_document = Nothing End If Set http = Nothing LireFlux = lngStatut End Function ' --- ' LECTURE D'UN NOEUD XML A PARTIR DE SON CHEMIN XPATH ' --- Private Function LireNoeud(ByVal strXPath As String) Dim nd As MSXML2.IXMLDOMNode Dim strValeur As String ' On ne fait rien si le document XML est vide If m_document Is Nothing Then LireNoeud = "" Exit Function End If ' Lire le noeud par son chemin XPath strValeur = "" Set nd = m_document.selectSingleNode(strXPath) If Not (nd Is Nothing) Then strValeur = nd.Text Set nd = Nothing ' Valeur de retour LireNoeud = strValeur End Function |
Tester !
Une classe VBA ne peut pas être testée directement, contrairement à des procédures de modules standard. Il va donc falloir créer une procédure, cette fois dans un module standard, qui va mettre en scène notre lecteur RSS. Après tous ces efforts, le code final devrait être plus clair (il consiste à « faire vivre » l’objet LecteurRSS
en faisant appel à ses propriétés et ses méthodes).
- Cliquez sur le menu Insertion / Module (tout court, pas « de classe »).
- Recopiez le code suivant :
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 |
' --- ' LECTURE RSS - VERSION 3 ' --- Sub LectureFluxRSS3() Dim strURL As String Dim rss As LecteurRSS ' URL à lire strURL = "http://rss.lemonde.fr/c/205/f/3050/index.rss" ' Lecteur RSS Set rss = New LecteurRSS rss.URL = strURL ' Lire le flux Dim lngStatut As Long lngStatut = rss.LireFlux() If lngStatut <> 200 Then Debug.Print "Erreur :" & lngStatut Else Debug.Print "DESCRIPTION DU FLUX" Debug.Print " TITRE : " & rss.Titre Debug.Print " LIEN : " & rss.Lien Debug.Print " DESCRIPTION : " & rss.Description Debug.Print " DATE PUBLICATION : " & rss.DatePublication Debug.Print " COPYRIGHT : " & rss.Copyright Debug.Print " GENERATEUR : " & rss.Generateur End If ' Libérer les objets ! Set rss = Nothing End Sub |
Exécutez ce code directement, comme dans les articles précédents. Vous devriez voir quelque chose comme ceci dans la fenêtre Exécution :