2010-02-04 42 views
3

我使用.NET.NET 2.0的RSS.NET。我嘗試過,也許,我得到0渠道爲以下幾點:RSS.NET無法解析feedburner提要

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

我注意,其他飼料這部作品如

​​

我猜它必須是一個有效的XML文檔。你認爲我應該檢查我的應用程序代碼中的「.xml」嗎?還是有什麼辦法可以調整RSS.NET接受feedburner提要?

回答

2

你無法獲得任何通道節點的原因是,原子格式沒有任何通道節點。檢查以下

你的第二連桿是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 
     } 

希望它可以幫助

+0

它的數字。謝謝您的幫助。我可以使用RSS.NET的原子分析器。你知道有什麼方法可以通過查看url來確定feed是rss還是atom? – Farooq 2010-02-04 13:22:30

+0

它是最棘手的部分,不幸的是,直到你從源文件加載文件,它是不可能檢查它是什麼格式。(我不知道,但我們用這個) – 2010-02-04 18:22:07

1

使用.NET 3.5+它很容易解析Atom提要。 BTW 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; 
    } 
} 

現在你可以一個對象的數據源指向上面的類,然後EVAL在你的ListView或radgrid控件的一些事情是這樣的:

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

與一對夫婦的FeedBurner測試飼料,它工作得很好。

1

我改進了JamesR的code有點,它現在返回一個成功的布爾值並接受一個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)) 
    { 

    }