2010-03-15 6 views
12

Ich versuche, den Inhalt eines RSS-Feeds in ein Objekt zu ziehen, die in Code manipuliert werden können. Es sieht so aus, als ob die SyndicationFeed- und SyndicationItem-Klassen in .NET 3.5 genau das tun, was ich brauche, abgesehen von einer Sache. Jedes Mal, wenn ich versucht habe, den Inhalt eines RSS-Feeds mit der SyndicationFeed-Klasse zu lesen, ist das .Content-Element für jedes SyndicationItem null.SyndicationItem.Content ist Null

Ich habe meinen Feed durch Feed Validator laufen und haben versucht, dies mit Feeds aus mehreren anderen Quellen, aber ohne Erfolg.

XmlReader xr = XmlReader.Create("http://shortordercode.com/feed/"); 
SyndicationFeed feed = SyndicationFeed.Load(xr); 

foreach (SyndicationItem item in feed.Items) 
{ 
    Console.WriteLine(item.Title.Text); 
    Console.WriteLine(item.Content.ToString()); 
} 

Console.ReadLine(); 

Ich vermute, ich kann nur irgendwo einen Schritt fehlt, aber ich kann nicht ein gutes Tutorial zu finden scheinen, wie RSS-Feeds zu konsumieren diese Klassen verwenden.

EDIT: Dank SLaks ich herausgefunden habe, dass das Problem mit Wordpress der Verwendung als Content-Tag ist. Dies scheint kein Problem mit den WP-Atom-Feeds zu sein, also werde ich als Lösung für jetzt gehen. Danke SLaks!

Antwort

11

Dies sollte Inhalt für Sie erhalten:

SyndicationFeed feed = SyndicationFeed.Load(reader); 

string content = feed.ElementExtensions.ReadElementExtensions<string>("encoded", "http://purl.org/rss/1.0/modules/content/") 
+0

Danke Francis. Ich habe gerade diese Lösung auf einem anderen SO-Post gefunden und es hat mir tatsächlich gegeben, was ich brauchte. Tatsächlich half es, zwei oder drei andere Nigglingprobleme auch zu lösen! – kdmurray

+0

funktionierte, wenn feed.items geändert wurde – Dragon

1

Verwenden Sie die Summary Eigenschaft.

Der RSS-Feed Sie verknüpft legt sein Gehalt im <description> Element.
As documented, das <description> Element einer RSS-Feeds Karten zur Summary Eigenschaft.

+1

Die Zusammenfassung Eigenschaft bietet nur eine kleine Menge des Inhalts aus dem Feed, nicht wahr? – kdmurray

+0

Es stellt das '' Element zur Verfügung. – SLaks

+0

Aber ich bin auf der Suche nach dem vollständigen Text der Artikel/Blog-Posts. Gehe ich falsch herum? – kdmurray

4

Schauen Sie, was ich tat:

XmlReader reader = XmlReader.Create("http://kwead.com/blog/?feed=atom"); 
    SyndicationFeed feed = SyndicationFeed.Load(reader); 
    reader.Close(); 

    foreach (SyndicationItem item in feed.Items) 
    { 
     string data = item.PublishDate.ToString(); 
     DateTime dt = Convert.ToDateTime(data); 

     string titulo = " - " + item.Title.Text + "<br>"; 
     string conteudo = ((TextSyndicationContent)item.Content).Text; 

     Response.Write(dt.ToString("d")); 
     Response.Write(titulo); 
     Response.Write(conteudo); 
    } 
+0

Das scheint bei Atom-Feeds richtig zu funktionieren, leider lässt die RSS-Spezifikation Erweiterungen zu, was der Content: encoded ist. Es ist gültig, und das verhindert, dass das Element item.content ordnungsgemäß funktioniert. – kdmurray

6

Sein aufgrund der Tatsache, dass es Inhalt ist: statt Inhalt codiert. Um den Inhalt in diesem Fall zu lesen, verwende ich das:

string content=""; 
    foreach (SyndicationElementExtension ext in item.ElementExtensions) 
    { 
     if (ext.GetObject<XElement>().Name.LocalName == "encoded") 
      content = ext.GetObject<XElement>().Value; 
    }