2010-03-15 12 views
12

Estoy tratando de extraer el contenido de una fuente RSS en un objeto que se puede manipular en el código. Parece que las clases SyndicationFeed y SyndicationItem en .NET 3.5 harán lo que necesito, excepto por una cosa. Cada vez que he tratado de leer los contenidos de una fuente RSS usando la clase SyndicationFeed, el elemento .Content para cada SyndicationItem es nulo.SyndicationItem.Content es nulo

He ejecutado mi alimentación a través de FeedValidator y he intentado esto con fuentes de varias otras fuentes, pero fue en vano.

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

sospecho que puede ser sólo faltaba un paso en alguna parte, pero me parece que no puede encontrar un buen tutorial sobre cómo consumir los canales RSS uso de estas clases.

EDIT: Gracias a SLaks he descubierto que el problema es con el uso de WordPress como etiqueta de contenido. Esto no parece ser un problema con los feeds de WP Atom, así que voy a ir con eso como una solución por ahora. Gracias SLaks!

Respuesta

11

Esto debe recibir todo el contenido para usted:

SyndicationFeed feed = SyndicationFeed.Load(reader); 

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

Gracias Francis. Acabo de encontrar esta solución en otra publicación SO y de hecho me dio lo que necesitaba. ¡De hecho, ayudó a resolver otros dos o tres problemas más! – kdmurray

+0

funcionó cuando se cambió feed.items – Dragon

1

Utilice la propiedad Summary.

La fuente RSS a la que vinculó pone su contenido en el elemento <description>.
As documented, el elemento <description> de un feed RSS se asigna a la propiedad Summary.

+1

La propiedad de resumen solo proporciona una pequeña cantidad del contenido de la fuente, ¿no es así? – kdmurray

+0

Proporciona el elemento ''. – SLaks

+0

Pero estoy buscando obtener el texto completo de los artículos/publicaciones en el blog. ¿Lo estoy haciendo mal? – kdmurray

4

Tome una mirada lo que hice:

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

Esto parece funcionar correctamente para alimentaciones atom, desafortunadamente la especificación RSS permite extensiones, que es lo que es el contenido: lo codificado. Es válido, y eso es lo que impide que la pieza item.content funcione correctamente. – kdmurray

6

Su debido al hecho de que se trata de contenido: codificada en lugar del contenido. Para leer el contenido en este caso, voy a utilizar esto:

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