2010-06-10 22 views
5

Có thể xác định từ ví dụ System.ServiceModel.Syndication.SyndicationFeed loại đọc nào của SyndicationFeed không? Nếu tất cả những gì tôi có là url (blahblah.com/feed), nó có thể là rss hoặc atom, và phụ thuộc vào kiểu tôi muốn làm một điều hay cái kia.Làm cách nào để xác định loại nguồn cấp dữ liệu của .NET SyndicationFeed (RSS vs Atom)?

Có cách nào đơn giản để nói mà không phân tích cú pháp tài liệu và tìm kiếm các ký tự cụ thể không?

Trả lời

10

Câu hỏi cũ, nhưng nó xứng đáng là câu trả lời.

một cách tương đối đơn giản để xác định xem bạn có nguồn cấp dữ liệu RSS hay Atom hay không. Nó đòi hỏi phải đọc, hoặc cố đọc tài liệu.

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

xem tôi đã nghĩ và thấy một ví dụ khác về điều này, nhưng tôi không nhớ tại sao tôi không thích nó. Cách đây rất lâu, và điều này hoạt động, vì vậy hãy xem xét câu trả lời này tốt nhất, cảm ơn :) – SelAromDotNet

+0

Ok vì vậy khi tôi thử nguồn cấp dữ liệu này (http://en.espnf1.com/rss/motorsport/story/feeds/0.xml ? type = 2) thuộc loại Atom 2.0, mã của bạn không hoạt động vì dòng atom.CanRead (reader) trả về false. Giải pháp ở đây để xử lý Atom Ver là gì. 2.0? – Marko

+0

Nó không phải là nguyên tử 2.0, theo như tôi biết. Có vẻ với tôi như là thức ăn đó bị hỏng. Nó có rác trong đó. Để giải quyết vấn đề này, tôi khuyên bạn nên sửa nguồn cấp dữ liệu trước khi thử đọc. Tôi chỉ thử điều này và nó làm việc cho tôi ở đây. – Cheeso

Các vấn đề liên quan