2010-06-10 1 views
5

Можно ли определить из экземпляра System.ServiceModel.Syndication.SyndicationFeed какой тип SyndicationFeed читается? Если все, что у меня есть, это url (blahblah.com/feed), это может быть rss или atom, и в зависимости от типа, который я хочу сделать, или что-то другое.Как определить тип подачи .NET SyndicationFeed (RSS против Atom)?

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

ответ

10

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

: - относительно простой способ определить, есть ли у вас 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; 
    } 
} 
+0

см. Я думал и видел еще один пример этого, но я не помню, почему мне это не понравилось. Это было так давно, и это работает, поэтому рассмотрим этот лучший ответ, спасибо :) – SelAromDotNet

+0

Хорошо, когда я пробую этот фид (http://en.espnf1.com/rss/motorsport/story/feeds/0.xml ? type = 2), который имеет тип Atom 2.0, ваш код не работает, поскольку строка atom.CanRead (reader) возвращает false. Каково решение здесь для работы с Atom Ver. 2,0? – Marko

+0

Это не атом 2.0, насколько я знаю. Мне кажется, что этот канал сломан. В нем есть мусор. Чтобы обойти это, я предлагаю исправить фид, прежде чем пытаться его прочитать. Я просто попробовал это, и это работает для меня здесь. – Cheeso