RSS Newsfeeds sind sehr beliebt, sind sie doch eine einfache Möglichkeit fremde News und Informationen in eigene Projekte zu integrieren. Viele große Firmen und Newsportale stellen ihre Schlagzeilen oder Topprodukte in Form von XML Newsfeeds zur Verfügung. Mit ASP.NET ist es relativ einfach auf solche Informationen zuzugreifen. Im folgenden Artikel wird ein Lösungansatz beschrieben wie ein solcher Zugriff auf RSS-Feeds realisiert werden kann.
Um Newsfeeds in eigene Projekte zu integrieren benötigt man zuerst eine Quelle.
C# Newsfeed - http://msdn.microsoft.com/vcsharp/rss.xml
VB.NET Newsfeed - http://msdn.microsoft.com/vbasic/rss.xml
Da RSS Newsfeeds in XML vorliegen kann man ganz bequem per XmlTextReader darauf zugreifen. Dannach erzeugt man ein DataSet welches über die Methode ReadXml den XmlTextReader einliest. Dies wird gemacht um nachher auf die DataTable mit dem Content zuzugreifen. Diese DataTable kann dann an ein beliebiges TemplateControl (Repeater, DataList, DataGrid) gebunden werden.
''' --------------------------------------- ''' <summary> ''' Liest den übergebenen RSS Feed in eine ''' DataTable ein und gibt diese zurück ''' </summary> ''' <param name="RSSUrl">URL zum RSS Feed</param> ''' <returns>DataTable mit angegebenen RSS ''' Informationen</returns> ''' --------------------------------------- Private Function GetRSS(ByVal RSSUrl As String) _ As DataTable
Dim reader As New XmlTextReader(RSSUrl) Dim ds As New DataSet ds.ReadXml(reader)
Dim rssTable As DataTable = ds.Tables(2)
ds.Dispose() reader.Close()
Return rssTable
End Function |
In die Funktion GetRSS wird die URL des Newsfeeds übergeben. Dann wird die Klasse XmlTextReader instanziert. Das darauf folgende DataSet ließt diese Daten ein und liefert die Tabelle mit den Daten welche in ein DataTable Object gespeichert wird.
Warum wird hier die dritte Tabelle zurück gegeben? Die erste Tabelle beschreibt das RSS Element in einer Zeile. Die zweite Tabelle beinhaltet auch nur eine Zeile in der das Channel Element beschrieben wird. Erst die dritte Tabelle liefert die gewünschten Informationen.
Am Ende wird das DataSet freigegeben und der XmlTextReader geschlossen. Dann wird die DataTable zurück gegeben.
Diese Funktion wird jetzt in der verwendet um die gelieferten Informationen in den Cache zu legen. Von dort aus wird die DataTable später an ein TemplateControl gebunden.
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load
Try
'Prüft ob das VB.NET RSS schon in den Cache gelegt wurde, 'wenn nicht in den Cache legen
If (Cache("MSDNVBRSS") Is Nothing) Then
'DataTable in den Cache legen Cache.Insert( _ "MSDNVBRSS", _ GetRSS("http://msdn.microsoft.com/vbasic/rss.xml"), _ Nothing, _ DateTime.Now.AddMinutes(20), _ TimeSpan.Zero _ )
End If
'VBRSS DataTable aus dem Cache an das RepeaterControl binden RepeaterVB.DataSource = Cache("MSDNVBRSS") RepeaterVB.DataBind()
'Prüft ob das C# RSS schon in den Cache gelegt wurde, 'wenn nicht in den Cache legen If (Cache("MSDNCSHARPRSS") Is Nothing) Then 'DataTable in den Cache legen Cache.Insert( _ "MSDNCSHARPRSS", _ GetRSS("http://msdn.microsoft.com/vcsharp/rss.xml"), _ Nothing, _ DateTime.Now.AddMinutes(20), _ TimeSpan.Zero _ )
End If
'C# DataTable aus dem Cache an das RepeaterControl binden RepeaterCSHARP.DataSource = Cache("MSDNCSHARPRSS") RepeaterCSHARP.DataBind()
Catch ex As Exception Response.Write(ex.Message) End Try
End Sub |
Damit nicht jedes Mal versucht wird die Newsfeeds einzulesen wird die DataTable in den Cache gelegt und von dort an das RepeaterControl gebunden. Und fertig ist die Newsseite:
Zur Ausgabe wird das RepeaterControl verwendet.
<asp:repeater id="RepeaterVB" runat="server" enableviewstate="False"> <headertemplate> <table> </headertemplate> <footertemplate> </table> </footertemplate> <itemtemplate> <tr> <td class="RSS"> <a href='<%# DataBinder.Eval(Container.DataItem, "link") %>' target="_blank" class="RSS"> <%# DataBinder.Eval(Container.DataItem, "title") %> </a> </td> <td class="Datum" align="right" valign="top"> <%# FormatDate(DataBinder.Eval(Container.DataItem, "pubDate")) %> </td> </tr> <tr> <td class="Beschreibung" colspan="2"> <%# DataBinder.Eval(Container.DataItem, "description") %> </td> </tr> </itemtemplate> </asp:repeater>
|
Zum formatieren des Datums wird folgende Funktion verwendet welche im itemtemplate des Repeaters aufgerufen wird.
''' ----------------------------------------------- ''' <summary> ''' Formatiert das per RSS Feed empfangene Datum. ''' </summary> ''' <param name="datum">Zu formatierendes Datum</param> ''' <returns>Formatiertes Datum</returns> ''' ----------------------------------------------- Protected Function FormatDate(ByVal datum As String) As String
Dim dt As DateTime = CType(datum, DateTime) Return dt.ToShortDateString()
End Function |