Lecture de flux RSS – Episode 4
Suite de la saga « Lecture de flux RSS » : cette fois, on va lire tous les articles du flux, en complément de l’en-tête. Et afficher le résultat dans la fenêtre Exécution.
Si vous avez manqué le début…
La saga « Lecture de flux RSS » a commencé par ces articles :
La classe ArticleRSS
Pour continuer l’orientation objet du projet, on va faire en sorte que chaque article soit décrit par une classe VBA : ArticleRSS
.
Un article a 3 propriétés principales :
- son indice (ordre dans la liste),
- son titre,
- son adresse (lien vers l’article d’origine).
Voici le code VBA, à recopier dans un module de classe (pas un module standard) que appellerez ArticleRSS
:
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 |
' ---------------------------------------- ' ATTRIBUTS DE LA CLASSE ' ---------------------------------------- Private m_intIndice As Integer Private m_strTitre As String Private m_strLien As String ' ---------------------------------------- ' PROPRIETES D'UN ARTICLE ' ---------------------------------------- ' --- ' INDICE DE L'ARTICLE DANS LE FLUX ' --- Property Get Indice() As Integer Indice = m_intIndice End Property Property Let Indice(ByVal intIndice As Integer) m_intIndice = intIndice End Property ' --- ' TITRE DE L'ARTICLE ' --- Property Get Titre() As String Titre = m_strTitre End Property Property Let Titre(ByVal strTitre As String) m_strTitre = strTitre End Property ' --- ' LIEN DE L'ARTICLE ' --- Property Get Lien() As String Lien = m_strLien End Property Property Let Lien(ByVal strLien As String) m_strLien = strLien End Property |
Le lecteur de flux RSS
Il faut compléter notre lecteur de flux RSS pour qu’il soit maintenant capable de lire les noeuds XML qui décrivent l’article, et qu’il stocke tous les articles dans un tableau d’instances de la classe ArticleRSS
précédente. Pour ceci, rouvrez la classe LecteurRSS
, et ajoutez-y ce bout de code :
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 |
' --- ' ARTICLES DU FLUX ' --- Property Get Articles() As ArticleRSS() Dim ndl As MSXML2.IXMLDOMNodeList Dim nd As MSXML2.IXMLDOMNode Dim intI As Integer ' Noeuds articles Set ndl = m_document.selectNodes("//channel/item") ' Compter le nombre d'articles dans le flux ' et créer un tableau d'éléments de cette taille Dim intArticles As Integer Dim art() As ArticleRSS intArticles = ndl.Length ReDim art(1 To intArticles) As ArticleRSS ' Lire tous les articles et les stocker For intI = 1 To intArticles Set art(intI) = New ArticleRSS With art(intI) .Indice = intI .Titre = ndl(intI - 1).selectSingleNode("title").Text .Lien = ndl(intI - 1).selectSingleNode("link").Text End With Next Articles = art End Property |
Procédure de test
Dans un module standard, recopiez le code suivant, qui représente la procédure de test (version améliorée de l’épisode 3). Cette procédure affiche le détail du flux dans la fenêtre Exécution.
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 |
' --- ' LECTURE RSS - VERSION 4 ' --- ' Note : Cette procédure fait appel à la fonction StringFormat(), ' qui doit figurer dans un module standard de la base de données. ' Sub LectureFluxRSS4() 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 Debug.Print ' Liste des articles Dim Articles() As ArticleRSS Dim intI As Integer Articles = rss.Articles Debug.Print "ARTICLES" For intI = LBound(Articles) To UBound(Articles) Debug.Print StringFormat(" {0}. {1}{2} {3}", _ Format(Articles(intI).Indice, "00"), _ Articles(intI).Titre, _ vbCrLf, _ Articles(intI).Lien) Debug.Print Next End If ' Libérer les objets ! Set rss = Nothing End Sub |
Effectivement cela peut sembler moins « paramétrable »… a tester pour pouvoir comparer.
Harnor > J’avais lu vite (et pensé à une mauvaise version d’Access). L’équivalent de cette option en VBA est :
Application.ImportXML source, options
Mais comme tout est (trop ?) automatisé pour lire différents formats XML, ça me semble moins pratique dans des scénarios précis.
désolé mon pseudo apparaissait sous Hervé mais je ne sais pas pourquoi enfin bref passons…
Euh on ne dois pas parler de la même chose, je parle de d’aller dans access 2010 puis a partir du menu :
« External Data »/ »XML File »/
Ici à la place d’un path d’un fichier xml, on peut entrer une url, par exemple :
http://www.mondespersistants.com/?p…
Et la cela crée des tables avec les articles récupérés…
Pas mal mais peut-on l’automatiser ?
Hervé > Merci pour les remerciements 🙂
Sinon, si on parle de la même option : il me semble que dans l’importation XML, seule une adresse de fichier local peut être fournie, mais pas une URL sur le Web.
On parle bien des données externes / XML, ou de l’équivalent en VBA ?
Merci Hervé pour vos excellent articles, d’ailleurs grâce à vous je me suis créé mon propre visualiseur de flux RSS. Cela m’aide beaucoup !!!!
Par contre je me demandais si il est possible en natif de récupérer le flux RSS dans access 2010. En effet j’ai vu qu’il était possible d’indiquer l’url d’un flux RSS dans l’option d’import de fichier xml. Peut-on automatiser cet import (refresh automatique en vba par exemple ?)
Merci beaucoup pour votre réponse si vous repassez par là et encore bravo pour ces excellent articles.