2010-06-10 2 views
5

Ist es möglich, aus der System.ServiceModel.Syndication.SyndicationFeed Instanz zu ermitteln, welche Art von SyndicationFeed gelesen wird? Wenn alles, was ich habe, die URL ist (blahblah.com/feed), könnte es rss oder atom sein, und abhängig vom Typ möchte ich das eine oder das andere tun.Wie Feed-Typ eines .NET SyndicationFeed (RSS vs Atom) zu bestimmen?

Gibt es eine einfache Möglichkeit zu sagen, ohne das Dokument zu analysieren und nach bestimmten Zeichen zu suchen?

Antwort

10

Alte Frage, aber es verdient eine Antwort.

Dort ist eine relativ einfache Möglichkeit zu bestimmen, ob Sie einen RSS- oder einen Atom-Feed haben. Es erfordert Lesen oder versuchen, das Dokument zu lesen.

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

sehe ich dachte und sah ein anderes Beispiel dafür, aber ich erinnere mich nicht, warum ich es nicht mochte. Es war so lange her, und das funktioniert, also halte das für die beste Antwort, danke :) – SelAromDotNet

+0

Ok also, wenn ich diesen Feed probiere (http://en.espnf1.com/rss/motorsport/story/feeds/0.xml ? type = 2) was vom Typ Atom 2.0 ist, funktioniert dein Code nicht, da die Zeile atom.CanRead (reader) false zurückgibt. Was ist die Lösung für Atom Ver? 2.0? – Marko

+0

Es ist nicht Atom 2.0, soweit ich weiß. Es sieht für mich so aus, als wäre das Futter kaputt. Es hat Müll darin. Um es zu umgehen, würde ich vorschlagen, den Feed zu reparieren, bevor Sie versuchen, es zu lesen. Ich habe es gerade versucht und es funktioniert für mich hier. – Cheeso