Lecteur rss en vb.net

Soyez le premier à donner votre avis sur cette source.

Vue 13 113 fois - Téléchargée 1 004 fois

Description

Bonjour à tous,
Je suis en train de développer une application pour laquelle j'ai décidé d'afficher des news sur la page d'accueil, de la même façon que la page de démarrage de Visual Studio.

J'ai donc créer quelques classes permettant de télécharger puis de décoder un flux RSS. N'ayant pas trouvé de classe toute faite en VB.NET permettant de décoder un flux RSS, j'ai donc décidé de vous la faire partager une fois créé.

Espérant que ceci soit utile à certains...

Source / Exemple :


RssReader: Permet de télécharger un flux de façon asynchrone
RssFeed: Flux RSS décodé, contenant les propriété du flux (Titre, image...) et une liste d'items
RssItem: Item d'un flux, contenant les propriété de l'item (titre, description, lien...)
RssTags: Nom/Valeur représentant un élément XML. (permet d'accéder à tous les éléments du flux)

Conclusion :


Rien de bien compliqué, j'ai créé ce code en quelques heures seulement (cet après midi). Il semblerait qu'aucun problème ne survienne quel que soit le flux RSS chargé. En théorie, il est compatible avec les flux RSS version 0.92, 0.93 et 2.0, mais encore une fois, je n'ai pas tout testé.

Sachez que la description d'un item d'un flux est souvent un texte contenant des tags html de ce genre là:
"contre la ratification du trait&eacute; de Lisbonne.<img width='1' height='1' src='http://rss.feedsportal.com/c/205/f/3050/s/15f09e1/mf.gif'"
Ceci est normal. A vous de décoder (ou supprimer) ces tags pour afficher le texte de façon correct (ce n'est pas fait dans ma source)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
2
Merci Kevin.Ory pour la précision de tes explications.
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Bonsoir,
Cette fois j'ai regardé mon code, ma réponse sera donc nettement plus pertinente que la dernière.

Pour ce qui est de l'erreur "L'exception TargetInvocationException n'est pas été gérée", celle-ci ne provient pas de ma classe RssReader mais de son implémentation trop simpliste dans mon application servant d'exemple: je n'y gère pas les erreurs retourné par le RssReader.

Il s'agit de cette méthode:

Private Sub Reader_Completed(ByVal Sender As Object, ByVal e As RSS.RssReader.CompletedEventArgs) Handles RssReader.Completed
RssFeed = e.Result
'RssFeed.LoadImage()

' Affichage des résultats
ShowDetailed()
ShowJoli()
End Sub

Il s'agit donc de la méthode appelé lorsque l'événement RssReader.Completed survient. Comme on peut le voir, aucun test n'est effectué pour savoir si le résultat est correct ou non. Pour corriger le problème, il suffit de tester la propriété Result de l'argument e pour voir si elle est à Nothing. Si une erreur survient durant le téléchargement, Result vaut toujours Nothing. (On peut aussi tester la propriété Error de e. Si Error = Nothing, cela veut dire que le résultat est correct):

Private Sub Reader_Completed(ByVal Sender As Object, ByVal e As RSS.RssReader.CompletedEventArgs) Handles RssReader.Completed
' Tester le résultat
If e.Result IsNot Nothing Then
RssFeed = e.Result

' Affichage des résultats
ShowDetailed()
ShowJoli()
Else
MsgBox("Une erreur est survenue: " & vbCrLf & e.Error.Message)
End If

End Sub

Par contre, suite à des test que je viens de faire, je constate qu'une autre erreur n'est pas géré, et cette fois-ci elle provient bien de ma classe RssReader. Celui-ci ne gère pas l'erreur qui survient lorsque le contenu téléchargé ne correspond pas à un flux RSS (lorsque on essaie d'ouvrir une adresse qui n'est pas un flux RSS). Pour corriger cela, il faut ajouter du code, déjà dans la méthode client_DownloadDataCompleted de la classe RssReader:

Private Sub client_DownloadDataCompleted(ByVal sender As Object, ByVal e As System.Net.DownloadDataCompletedEventArgs) Handles client.DownloadDataCompleted
client = Nothing
Dim res As RssFeed = Nothing
Dim err As Exception = e.Error

If e.Error Is Nothing And e.Cancelled = False Then
Try
' Créer le RssFeed
res = New RssFeed(e.Result)
Catch ex As Exception
' Le contenu téléchargé ne peut être ouvert
res = Nothing
err = ex
End Try
End If

Dim args As New CompletedEventArgs(res, e.Error, e.Cancelled, e.UserState)
RaiseEvent Completed(Me, args)
End Sub

De cette façon, on gère l'erreur qui survient lorsque le contenu ne peut pas être ouvert par le RssFeed.

Voyons maintenant comme RssFeed gère le chargement des données (RssFeed.New). D'abord il ouvre le contenu avec un XmlDocument, une erreur surviendra lorsque le contenu n'est pas du XML, mais cela ne prouve pas que le contenu n'est pas un flux RSS. Il faudra donc aussi rajouter des tests pour savoir si le contenu correspond à un flux Rss ou à un autre contenu XML:

Avec quelques Try et ThrowException, on peut améliorer la gestion de ces erreurs, mais sans toutefois garantir que le flux RSS contient des données valides (la personne l'ayant publiée peut avoir fait des erreur de syntaxe...).
Remplacer ces 3 méthode dans la classe RssFeed:

Public Sub New(ByVal Datas() As Byte)
Me.New(New IO.MemoryStream(Datas))
End Sub
Public Sub New(ByVal Stream As IO.Stream)
Dim doc As New XmlDocument
Try
doc.Load(Stream)
Catch ex As Exception
Throw New Exception("Les données téléchargé ne correspondent pas à un contenu XML", ex)
End Try
LoadXml(doc)
End Sub

Private Sub LoadXml(ByVal doc As Xml.XmlDocument)
tags.Clear()
If doc.DocumentElement.Name.ToLower = "rss" Then
Dim version As String = doc.DocumentElement.GetAttribute("version")
tags.Add(New RssTag("version", version))
If version "2.0" Or version "0.92" Or version = "0.93" Then
Try
Dim channel As XmlElement = doc.DocumentElement.GetElementsByTagName("channel")(0)
For Each elem As XmlElement In channel
If elem.Name.ToLower = "item" Then
' Un item
_Items.Add(New RssItem(elem))
Else
' Un tag du channel
LoadElem("", elem)
End If
Next
Catch ex As Exception
Throw New Exception("Une erreur est survenue lors de la lecture du flux RSS")
End Try
Else
Throw New Exception("Le contenu ne correspond pas à un flux RSS version 2.0")
End If
Else
Throw New Exception("Le contenu ne correspond pas à un flux RSS")
End If
End Sub

En conclusion, je constate que je n'avais pas beaucoup travaillé sur la gestion des erreurs avant de publier cette source. J'ai aussi remarque que seul la version 2.0 était accepté dans mon code, ce qui n'est plus le cas dans mon code ci-dessus (ajout de la version 0.92 et 0.93). Mais le code donne une idée, et tout fonctionnait si le contenu téléchargé était soit un flux RSS, soit rien.

Pour ta 2ème question, je ne comprend pas de où vient ton problème. Je ne gère pas la sélection dans mon lstRssItems_DrawItem, et ça se voit si je test chez moi: rien ne change lorsque je clique sur un item.

Bonne nuit, et au plaisir de t'aider...
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
2
Kevin.Ory,

Lorsque l'on clique sur l'un des items de la liste, l'items concerné devient flou/et gras, comme s'il y avait 2 textes identiques superposés.

Peut-on empêcher cet affichage ?

Merci par avance,
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
2
pourtant il y a bien un try/cath

Try

' Affichage
lblTitle.Text = ""
lblDescription.Text = ""
picImage.Image = Nothing
lstRssItems.Items.Clear()

' Téléchargement du flux
RssReader = New RSS.RssReader
RssReader.Load(New Uri(path))

Catch ex As Exception
MsgBox(ex.Message)
End Try
Messages postés
840
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
7 janvier 2009
9
Salut DSIGMOUN,

Il y a My.Computer.Network.IsAvailable qui te permet de savoir si l'ordinateur est connecté sur un réseau, mais ça n'assure pas pour autant que le flux RSS est accessible. Le mieux est de faire la connexion dans un Try/Catch pour gérer l'erreur à ta façon...

Pour la sauvegarde sur le disque dur, ce n'est pas implémenté mais c'est très facile à ajouter cette fonctionnalité puisque j'utilise un XmlDocument dans mon code pour charger le flux RSS. Un flux RSS n'est rien d'autre qu'un fichier XML, qu'il suffit d'enregistrer sur le disque dur si tu veux le recharger plus tard...
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.