RSS.NET не может разобрать фиды FeedBurner - PullRequest
3 голосов
/ 04 февраля 2010

Я использую RSS.NET для .NET 2.0. Попробуйте, как я мог, я получаю 0 каналов для следующего:

feed = RssFeed.Read("http://feeds.feedburner.com/punchfire?format=xml");

Замечу, что для других каналов это работает, например.

feed = RssFeed.Read("http://www.engadget.com/rss.xml");

Полагаю, это должен быть действительный документ xml . Как вы думаете, мне следует проверять наличие «.xml» в коде моего приложения, или есть ли способ настроить RSS.NET на прием feedburner каналов?

Ответы [ 4 ]

2 голосов
/ 04 февраля 2010

Причина, по которой вы не можете получить какие-либо узлы канала, состоит в том, что атомный формат не имеет никаких узлов канала. проверьте следующее

Ваша вторая ссылка - лента RSS, которая содержит узел канала, как показано ниже

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">
<channel>
<title>Engadget</title>
<link>http://www.engadget.com</link>
 .
 .
 .

С другой стороны, в ленте атомов не используются канальные узлы, как вы могли бы понять, перейдя по ссылке спецификации выше.

<?xml version="1.0" encoding="utf-8"?>
   <feed xmlns="http://www.w3.org/2005/Atom">
     <title type="text">dive into mark</title>
     <subtitle type="html">
       A &lt;em&gt;lot&lt;/em&gt; of effort
       went into making this effortless
     </subtitle>
     <updated>2005-07-31T12:29:29Z</updated>
     <id>tag:example.org,2003:3</id>
     <link rel="alternate" type="text/html"
      hreflang="en" href="http://example.org/"/>
     <link rel="self" type="application/atom+xml"
      href="http://example.org/feed.atom"/>
     <rights>Copyright (c) 2003, Mark Pilgrim</rights>
     <generator uri="http://www.example.com/" version="1.0">
       Example Toolkit
     </generator>
     <entry>
      .
      .
      .

РЕДАКТИРОВАТЬ: Для проверки подачи Формат

    // url of the feed 
    string utlToload = @"http://feeds.feedburner.com/punchfire?format=xml"



    // load feed
        Argotic.Syndication.GenericSyndicationFeed feed = 
Argotic.Syndication.GenericSyndicationFeed.Create(new Uri(urlToLoad));

        // check what format is it
        if (feed.Format.Equals(SyndicationContentFormat.Rss))
        {
            // yourlogic here
        }
        else if (feed.Format.Equals(SyndicationContentFormat.Atom))
        {
            // yourlogic here
        } 
        else if (feed.Format.Equals(SyndicationContentFormat.NewsML))
        {
            // yourlogic here
        } 

Надеюсь, это поможет

1 голос
/ 15 декабря 2010

Я немного улучшил код Джеймса , который теперь возвращает логическое значение успеха и принимает объект ByRef syndicationfeed;

public static class FeedParser
{
    public static bool Parse(string url, ref SyndicationFeed feed)
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.CheckCharacters = true;
        settings.CloseInput = true;
        settings.IgnoreComments = true;
        settings.IgnoreProcessingInstructions = true;
        settings.DtdProcessing = DtdProcessing.Prohibit;

        if (string.IsNullOrEmpty(url)) return false;

        using (XmlReader reader = XmlReader.Create(url, settings))
        {
            SyndicationFeedFormatter formatter = null;
            Atom10FeedFormatter atom_formatter = new Atom10FeedFormatter();
            Rss20FeedFormatter rss_formatter = new Rss20FeedFormatter();

            if (reader.ReadState == ReadState.Initial) reader.MoveToContent();

            if (atom_formatter.CanRead(reader)) formatter = atom_formatter;
            if (rss_formatter.CanRead(reader)) formatter = rss_formatter;
            if (formatter == null) return false;

            formatter.ReadFrom(reader);
            feed = formatter.Feed;

            return true;
        }
    }        
}

, который можно использовать как;

    SyndicationFeed feed=null;

    if(FeedParser.Parse(url,ref feed))
    {

    }
1 голос
/ 08 октября 2010

С .Net 3.5+ очень легко разбирать каналы Atom.Кстати, каналы Atom - это новый стандарт RSS, который я слышу.

public class RssFeedDO
{
    public string RssFeedUrl { get; private set; }

    /// <summary>
    /// Build feed processor
    /// </summary>
    /// <param name="feedUrl">Atom or RSS url with http in front.</param>
    public RssFeedDO(string feedUrl)
    {
        this.RssFeedUrl = feedUrl;
    }

    /// <summary>
    /// Will try to get RSS data from url passed in constructor. Can do atom or rss
    /// </summary>
    /// <returns></returns>
    public SyndicationFeed GetRSSData()
    {
        SyndicationFeed feed = null;

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.CheckCharacters = true;
        settings.CloseInput = true;
        settings.IgnoreComments = true;
        settings.IgnoreProcessingInstructions = true;
        settings.DtdProcessing = DtdProcessing.Prohibit;

        if (!string.IsNullOrEmpty(this.RssFeedUrl))
        {
            using (XmlReader reader = XmlReader.Create(this.RssFeedUrl, settings))
            {
                SyndicationFeedFormatter GenericFeedFormatter = null;
                Atom10FeedFormatter atom = new Atom10FeedFormatter();
                Rss20FeedFormatter rss = new Rss20FeedFormatter();

                if (reader.ReadState == ReadState.Initial)
                {
                    reader.MoveToContent();
                }
                // try either atom or rss reading
                if (atom.CanRead(reader))
                {
                    GenericFeedFormatter = atom;
                }
                if (rss.CanRead(reader))
                {
                    GenericFeedFormatter = rss;
                }
                if (GenericFeedFormatter == null)
                {
                    return null;
                }
                GenericFeedFormatter.ReadFrom(reader);
                feed = GenericFeedFormatter.Feed;
            }
        }
        return feed;
    }
}

Теперь вы можете указать объектный источник данных на вышеуказанный класс и затем оценить некоторые вещи в вашем ListView или RadGrid, например:

<%# Eval("Title.Text") %>

Протестировано с парой фидов с подачей ивсе работало нормально.

0 голосов
/ 04 февраля 2010

http://feeds.feedburner.com/punchfire?format=xml похоже на Atom фид, а не RSS . Rss.net знает, как с этим справиться?

...