SyndicationItem.Content имеет значение Null - PullRequest
13 голосов
/ 15 марта 2010

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

РЕДАКТИРОВАТЬ: Благодаря SLaks я понял, что проблема заключается в использовании WordPress в качестве тега содержимого. Похоже, что это не проблема с фидами WP Atom, поэтому я пока воспользуюсь этим решением. Спасибо SLaks!

Ответы [ 4 ]

12 голосов
/ 04 января 2011

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

SyndicationFeed feed = SyndicationFeed.Load(reader);

string content = feed.ElementExtensions.ReadElementExtensions<string>("encoded", "http://purl.org/rss/1.0/modules/content/")
6 голосов
/ 08 июня 2011

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

    string content="";
    foreach (SyndicationElementExtension ext in item.ElementExtensions)
    {
        if (ext.GetObject<XElement>().Name.LocalName == "encoded")
            content = ext.GetObject<XElement>().Value;
    }
4 голосов
/ 29 мая 2010

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

    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);
     }
1 голос
/ 15 марта 2010

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

RSS-канал, на который вы ссылаетесь, помещает свое содержимое в элемент <description>.
Как задокументировано , элемент <description> RSS-канала соответствует свойству Summary.

...