Verfasst von: bletra | 19. Juni 2011

Über die Einfachheit von Feeds-Verarbeitung in C#

Autor: D. Büchsel

Immer mehr Seiten im Netz unterstützen sogenannte (News-)Feeds. Die Vorteile liegen auf der Hand: Durch Feeds, seien es nun RSS- oder Atom-Feeds, lassen sich, insbesondere Newsseiten, einfach und unkompliziert überwachen und über etwaige  Änderungen informieren. Da ist es nicht verwunderlich, dass uns .NET hierfür eine gute, und vor allem eine einfache Schnittstelle für diese Aufgaben bietet.

Im Folgenden möchten wir ein kleines Beispiel zum Thema Feeds behandeln, um zu zeigen wie einfach die Nutzung der entsprechenden Klassen ist. In unserem Beispiel möchten wir den RSS Feed des Fachbereichs Informatik der Hochschule Darmstadt [1] abfragen und in einer Liste speichern und ausgeben.

Herzstück unseres Programms sind die Syndication-Klassen[2][3], sowie die WebClient-Klasse[4], welche uns die nötigen Funktionalitäten bietet, um Atom1.0- sowie RSS2.0-Feeds zu verarbeiten. Damit wir die Syndication-Klassen nutzen können, müssen wir vorher die entsprechende Referenz einbinden. Dies ist die System.ServiceModel (in System.ServiceModel.dll). Für unser Beispiel benötigen wir zudem die Using-Direktiven für System.Collections.Generic, System.IO, System.Net, System.ServiceModel.Syndication und System.Xml.

Nun aber zu unserem Beispiel: Unser erster Schritt zur Verarbeitung der Feeds ist sicherlich überhaupt erst einmal die Feeds herunterzuladen. Wobei wir von einem Download abstrahieren möchten und das Einlesen der Datei als Stream bevorzugen. Das bietet nicht nur den Vorteil, dass wir die Datei nicht auf unserer Festplatte zwischenspeichern müssen, sondern bietet auch die Möglichkeit eines kürzeren und schöneren Codes.

Uri url = new Uri("http://www.fbi.h-da.de/index.php?id=1955&type=100"); //Url zu Feed

WebClient request = new WebClient(); //stellt die Verbindung zur Webseite her
Stream stream = request.OpenRead(url); //öffnet Url als Stream
using (StreamReader reader = new StreamReader(stream)) //öffnen eines Readers auf dem Stream
{
    //TODO: Hier möchten wir unsere Feeds parsen
}

Wir haben nun einen StreamReader für unseren Feed (in diesem Fall ein RSS-Feed) geöffnet und können diesen nun an unseren XmlReader weitergeben. Der XmlReader stellt, wie der Name schon sagt, einen weiteren Reader zur Verfügung (noch haben wir nichts gelesen!). Den XmlReader übergeben wir wiederum als Parameter an die statische Load-Funktion von SyndicationFeed. Diese bietet uns als Rückgabe eine Instanz von SyndicationFeed, welche uns Zugriff auf die runtergeladenen Feeds bietet. Mittels Items-Property bekommen wir Zugriff auf die Feeds und können nun beliebige Operationen damit durchführen. Um das Beispiel nicht unnötig aufzublasen, fügen wir das Item nur einer Liste hinzu ohne weitere Operationen auszuführen. Hier könnten wir bspw. nur Feeds einfügen, die ein bestimmtes Keyword beinhalten oder von einem bestimmten Autor verfasst wurden.

Uri url = new Uri("http://www.fbi.h-da.de/index.php?id=1955&type=100"); //Url zu Feed

List<SyndicationItem> collection = new List<SyndicationItem>();

WebClient request = new WebClient(); //stellt die Verbindung zur Webseite her
Stream stream = request.OpenRead(url); //öffnet Url als Stream
using (StreamReader reader = new StreamReader(stream)) //öffnen eines Readers auf dem Stream
{
    XmlReader xmlReader = XmlReader.Create(reader); //öffnet einen Reader zum XML parsen
    SyndicationFeed feed = SyndicationFeed.Load(xmlReader); //öffnet Parser für Feeds vom XML Reader

    //parsen:
    foreach (SyndicationItem item in feed.Items)
    {
        collection.Add(item);
    }
}

Schlussendlich möchten wir von unseren Feeds auch mal etwas sehen. SyndicationItem bietet uns hier einige Propertys um auf dessen Feed-Attribute zuzugreifen. Sind die entsprechenden Attribute nicht verfügbar, gibt das Property null zurück. In unserem Beispiel möchten wir den Titel (der sollte im Allgemeinen immer verfügbar sein) und wenn verfügbar, dessen Id auf der Konsole ausgeben. Eine vollständige Liste aller Propertys ist unter [3] zu finden.

Uri url = new Uri("http://www.fbi.h-da.de/index.php?id=1955&type=100"); //Url zu Feed

List<SyndicationItem> collection = new List<SyndicationItem>();

WebClient request = new WebClient(); //stellt die Verbindung zur Webseite her
Stream stream = request.OpenRead(url); //öffnet Url als Stream
using (StreamReader reader = new StreamReader(stream)) //öffnen eines Readers auf dem Stream
{
    XmlReader xmlReader = XmlReader.Create(reader); //öffnet einen Reader zum XML parsen
    SyndicationFeed feed = SyndicationFeed.Load(xmlReader); //öffnet Parser für Feeds vom XML Reader

    //parsen:
    foreach (SyndicationItem item in feed.Items)
    {
        collection.Add(item);
    }
}

…

foreach (SyndicationItem item in collection)
{
    if (item.Id != null)
        System.Console.Write(item.Id + ": ");
    System.Console.WriteLine(item.Title.Text);
}

Wie man sehen kann, ist die Verarbeitung von RSS Feeds unter .NET im Vergleich mit anderen Lösungen (z. B. unter C++) kinderleicht. Dass ATOM- und RSS-Feeds dabei auf die gleiche Weise verwendet werden können, setzt dem ganzen noch ein i-Tüpfelchen oben drauf und bietet eine Menge Einsatzmöglichkeiten.

Referenzen:
[1] http://www.fbi.h-da.de/index.php?id=1955type=100
[2] http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx
[3] http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationitem.aspx
[4] http://msdn.microsoft.com/en-US/library/system.net.webclient%28v=VS.80%29.aspx

Advertisements

Responses

  1. Schönes Beispiel, hat mir sehr geholfen! 😉

  2. da fällt mir grade auf, dass der feed des beispiels keine umlaute ausgibt 😦


Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Kategorien

%d Bloggern gefällt das: