2010-03-15 6 views
12

Я пытаюсь вытащить содержимое RSS-канала в объект, который можно манипулировать кодом. Похоже, что классы SyndicationFeed и SyndicationItem в .NET 3.5 будут делать то, что мне нужно, за исключением одного. Каждый раз, когда я пытался читать содержимое RSS-канала, используя класс SyndicationFeed, элемент .Content для каждого объекта SyndicationItem имеет значение null.SyndicationItem.Content is Null

Я запустил свой канал через FeedValidator и попробовал это с помощью каналов из нескольких других источников, но безрезультатно.

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

Я подозреваю, что может быть просто отсутствует шаг куда-то, но я не могу найти хороший учебник о том, как потреблять RSS-каналы с помощью этих классов.

EDIT: Благодаря SLaks я выяснил, что проблема заключается в использовании WordPress в качестве тега контента. Кажется, это не проблема с каналами WP Atom, поэтому я пока займусь этим решением. Благодаря SLaks!

ответ

11

Это должно получить содержание для вас:

SyndicationFeed feed = SyndicationFeed.Load(reader); 

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

Спасибо Фрэнсис. Я только наткнулся на это решение на другом посту SO, и он действительно дал мне то, что мне было нужно. На самом деле это помогло решить две или три другие проблемы с придиркой! – kdmurray

+0

работал при изменении feed.items – Dragon

1

Используйте Summary.

RSS-канал, который вы связали, помещает его содержимое в элемент <description>.
As documented, <description> элемент карты RSS-канала к объекту Summary.

+1

Сводное свойство предоставляет только небольшое количество контента из фида, не так ли? – kdmurray

+0

Он содержит элемент ''. – SLaks

+0

Но я ищу, чтобы получить полный текст статей/сообщений в блогах. Неужели я ошибаюсь? – kdmurray

4

Посмотрите, что я сделал:

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

Это, похоже, работает правильно для подачи Atom, к сожалению, спецификация RSS позволяет расширять, что и есть содержимое: закодированная вещь. Это действительно так, и это то, что мешает элементу item.content работать правильно. – kdmurray

6

Сво из-за того, что это содержание: кодируемого вместо содержимого. Чтобы прочитать содержание в этом случае, я собираюсь использовать это:

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