Das Erzeugen einer XML-Struktur, die der
RSS-Spezifikation entspricht ist gar nicht so kompliziert - erst recht nicht, seitdem man mit Linq-To-Xml recht einfach durch XML-Dokumente navigieren und diese auch modifizieren kann. Nachteil ist: Man muss die Spezifikation immer griffbereit haben, denn ganz schnell kommt man zu Fragen wie: "Wie hieß noch gleich das XML-Element für das Erstellungsdatum und in welchem Format muss es ausgegeben werden?" Was bisher aber nur wenige zu wissen scheinen: So viel Arbeit muss man sich gar nicht mehr machen. Seit dem .NET Framework 3.5 gibt es den Namespace System.ServiceModel.Syndication, dessen Klassen einen Großteil der Arbeit abnehmen. Die Erstellung ist ganz einfach: Zunächst erstellt man sich ein Objekt vom Typ SyndicationFeed. Dieses Objekt repräsentiert den eigentlichen Feed und dessen Eigenschaften.
// create new syndication feed
var feed = new SyndicationFeed("Mein Blog Feed",
"Wissenwertes über ASP.NET, WPF und Silverlight",
new Uri("http://feeds.feedburner.com/discoveringmicrosofttechnologies"))
{
Language = "de-DE",
Copyright = new TextSyndicationContent("Unique Software"),
Generator = "Unique Software News Generator"
};
Die Klasse SyndicationItem ermöglicht es dann, ebenfalls über das Objektmodell, die eigentlichen Einträge zu erzeugen, die mit Hilfe des Feeds übermittelt werden sollen. Diese werden dann dem Feed-Objekt nur noch zugewiesen.
// create syndication items which should be delivered
var items = new List<SyndicationItem>();
for (var i = 0; i < 5; i++)
{
var item = new SyndicationItem
{
Id = "http://myfeeds/2011/06/" + i,
PublishDate = DateTime.Now,
Title = SyndicationContent
.CreatePlaintextContent("Wichtige Mitteilung"),
Content = SyndicationContent
.CreateHtmlContent("Meine wichtige Nachricht an alle Leser"),
Summary = SyndicationContent
.CreatePlaintextContent("Zusammenfassung meiner Mitteilung")
};
items.Add(item);
}
feed.Items = items;
Das war's auch schon fast: Letzter Schritt ist die Umwandlung in XML. Dafür gibt es auf dem Feed-Objekt die Methoden SaveAsAtom10 und SaveAsRss20, die diese Arbeit übernehmen.
var builder = new StringBuilder();
using (var writer = XmlWriter.Create(builder))
{
feed.SaveAsRss20(writer);
writer.Flush();
writer.Close();
}
var xml = builder.ToString();
Im Hintergrund kommen hier je nach Methode die Atom10FeedFormatter-Klasse bzw. die Rss20FeedFormatter-Klasse zum Einsatz. Und mit diesem XML kann man nun das gleiche machen, was man sonst mit dem XML gemacht hätte, das man mit Linq-To-Xml zusammengebaut hätte: Man liefert es aus.
Englische Version