2010-03-15 7 views
12

J'essaie de tirer le contenu d'un flux RSS dans un objet qui peut être manipulé dans le code. Il semble que les classes SyndicationFeed et SyndicationItem dans .NET 3.5 feront ce dont j'ai besoin, sauf pour une chose. Chaque fois que j'ai essayé de lire le contenu d'un flux RSS à l'aide de la classe SyndicationFeed, l'élément .Content pour chaque SyndicationItem est null.SyndicationItem.Content est nul

J'ai lancé mon flux via FeedValidator et j'ai essayé ceci avec des flux de plusieurs autres sources, mais en vain.

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(); 

Je pense que je peux juste être absent une étape quelque part, mais je ne peux pas sembler trouver un bon tutoriel sur la façon de consommer des flux RSS en utilisant ces classes.

EDIT: Merci à SLaks, j'ai compris que le problème est avec l'utilisation de WordPress comme la balise de contenu. Cela ne semble pas être un problème avec les flux WP Atom donc je vais aller avec cela comme une solution pour l'instant. Merci SLaks!

Répondre

11

Cela devrait obtenir du contenu pour vous:

SyndicationFeed feed = SyndicationFeed.Load(reader); 

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

Merci Francis. Je suis juste tombé sur cette solution sur un autre post SO et il m'a effectivement donné ce dont j'avais besoin. En fait, cela a aussi aidé à résoudre deux ou trois autres problèmes! – kdmurray

+0

travaillé lorsque modifié feed.items – Dragon

1

Utilisez la propriété Summary.

Le flux RSS auquel vous avez associé met son contenu dans l'élément <description>. L'élément d'un flux RSS est mappé à la propriété Summary.

+1

La propriété summary ne fournit qu'une petite partie du contenu du flux, n'est-ce pas? – kdmurray

+0

Il fournit l'élément ''. – SLaks

+0

Mais je cherche à obtenir le texte intégral des articles/billets de blog. Est-ce que je vais mal? – kdmurray

4

Jetez un oeil ce que je faisais:

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

Cela semble fonctionner correctement pour les flux atomiques, malheureusement la spécification RSS permet les extensions, ce qui est le contenu: chose encodée. C'est valide, et c'est ce qui empêche le morceau item.content de fonctionner correctement. – kdmurray

6

Son dû au fait qu'il est contenu: codé au lieu de contenu. Pour lire le contenu dans ce cas, je vais utiliser ceci:

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