Как определить тип фида.NET SyndicationFeed (RSS против Atom)?

Можно ли определить из экземпляра http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx, какой тип SyndicationFeed читается? Если все, что у меня есть, это URL (blahblah.com/feed), то это может быть rss или atom, и в зависимости от типа я хочу сделать то или иное.

Есть ли простой способ сказать, не анализируя документ и не ища определенные символы?

1 ответ

Решение

Старый вопрос, но он заслуживает ответа.

Существует относительно простой способ определить, есть ли у вас канал RSS или Atom. Это требует чтения или попытки прочитать документ.

public SyndicationFeed GetSyndicationFeedData(string urlFeedLocation)
{
    XmlReaderSettings settings = new XmlReaderSettings
        {
            IgnoreWhitespace = true,
            CheckCharacters = true,
            CloseInput = true,
            IgnoreComments = true,
            IgnoreProcessingInstructions = true, 
            //DtdProcessing = DtdProcessing.Prohibit // .NET 4.0 option
        };

    if (String.IsNullOrEmpty(urlFeedLocation))
        return null;

    using (XmlReader reader = XmlReader.Create(urlFeedLocation, settings))
    {
        if (reader.ReadState == ReadState.Initial)
            reader.MoveToContent();

        // now try reading...

        Atom10FeedFormatter atom = new Atom10FeedFormatter();
        // try to read it as an atom feed
        if (atom.CanRead(reader))
        {
            atom.ReadFrom(reader);
            return atom.Feed;
        }

        Rss20FeedFormatter rss = new Rss20FeedFormatter();
        // try reading it as an rss feed
        if (rss.CanRead(reader))
        {
            rss.ReadFrom(reader);
            return rss.Feed;
        }

        // neither?
        return null;
    }
}
Другие вопросы по тегам