Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LECTEUR RSS EN VB.NET


Information sur la source

Description

Cliquez pour voir la capture en taille normale
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

  • 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)
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é 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)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de gillardg le 02/07/2008 21:01:05

Pour  info il existe un exemple microsoft

RSS Reader
http://download.microsoft.com/download/2/c/1/2c1b5978-80cb-4c22-88b3-ab536344ba49/vb%202005%20-%20windows%20rss%20reader.msi
aussi un Screen Saver Starter Kit (lecteur RSS)
aussi l'exemple MyBlog
http://download.microsoft.com/download/4/D/2/4D2E7BA0-3952-4D1F-9801-E07B2224283A/MyBlogs.msi

signaler à un administrateur
Commentaire de dsigmoun le 28/11/2008 16:37:47

lorsque je suis déconnecté un message d'erreur apparaît lors du chargement du flux."L'exception TargetInvocationException n'est pas été gérée"

Y a-t'il un moyen de vérifier si l'on est connecté ?

En cas de non connexion, est-il possible de lire le flux que l'on aurait automatiquement sauvegardé lors d'une précédemment connexion ?

signaler à un administrateur
Commentaire de Kevin.Ory le 29/11/2008 00:53:02

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...

signaler à un administrateur
Commentaire de dsigmoun le 29/11/2008 08:55:37

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

signaler à un administrateur
Commentaire de dsigmoun le 03/12/2008 13:49:14

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,

signaler à un administrateur
Commentaire de Kevin.Ory le 06/12/2008 02:13:19

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...

signaler à un administrateur
Commentaire de dsigmoun le 06/12/2008 06:56:44

Merci Kevin.Ory pour la précision de tes explications.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Barre des Tâches + Flux RSS [ par keawee ] Bonjour, Je souhaiterais vous poser une question concernant la barre des tâches. Celle qui est sur mon ordinateur j'ai Démarrer + icones de generateur RSS [ par maurimaure ] Bonjour à tous, J'aimerais écrire un script php qui permet la generation des flux RSS pour les sites qui en proposent pas. par exemple je do lecteur RSS [ par tchouny ] Salut à tous,je n'ai pas le temps de le développer moi-même car je suis full busy sur un autre projet, dés lors j'en appelle à vous.je recherche un le flux rss [ par imedgamra ] bonjour tout le monde s'il vous plait s'il ya qui quelqu'un  qui peut m'aider je veux avoir le code et les fichiers necessaires qui generent un flux r Edit de post, RSS [ par faucheuse ] J'y pense depuis que je suis sur ce forum, mais ne pas pouvoir editer ses post c'est embetant. En effet je retourne généralement plusieurs fois sur m Flux vidéo et carte d'aquisition. [ par c0pyright ] Probleme de conversion de flux de bourse [ par foufidou ] Bonjour tout le monde,mon probleme est que lors de la reception d'un flux (plus exactement un flux MMTP pour les pros de la bourse :) ) la totalité du erreur de calcul avec double [ par ddove53 ] Slt, j'ai un probléme de virgule avec  ma syntaxe. ça doit etre un probléme de  "." et( de",".Pouvez-vous m'aider?Dim taux() As DoubleReDim taux(20)  date et web service [ par luxior1 ] Bonjour,j'ai un problème lors de l'utilisation d'un web service.en entrée, je fournie une date en paramêtre. Pourtant les collègues qui fournissent le Agragateur de flux [ par ov3rdoze ] Bonjour à tousJe cherche à développer une sorte d'agrégateur de flux RSS allégé, ne permettant de suivre qu'un seul fil pré-enregistré (pour éviter de


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.