2011-10-15 42 views
4

我寫了一段代碼,它使用System.ServiceModel.Syndication庫來解析RSS提要。Syndication RSS閱讀器由於XML無效而失敗?

問題是,對於我的一個提要(由facebook提供),我在響應結束時收到以下代碼行,並且Syndication庫無法解析提要,因爲它說文本是無效的XML,這是因爲這部分的:

... 
    </channel> 
    <access:restriction relationship="deny" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" /> 
</rss> 

我敢肯定有我丟失的東西在這裏,因爲這兩種飼料和解析庫是從大公司(Facebook和微軟分別)。

你們能幫忙嗎?或者,更好的解析器不依賴於XML的有效性?

P.S.這裏是我的RSS Feed網址:
http://www.facebook.com/feeds/page.php?id=202296766494181&format=rss20

這裏是我如何解析飼料的響應:

var stringReader = new StringReader(resp); 
var xreader = XmlReader.Create(stringReader); 
var xfeed = System.ServiceModel.Syndication.SyndicationFeed.Load(xreader); 

和例外,我得到:

System.Xml.XmlException: 'Element' is an invalid XmlNodeType. Line 282, position 4. 

在的System.Xml。 XmlReader.ReadEndElement()...

+0

也許這篇文章可以幫助你[鏈接] connect.microsoft。 com/VisualStudio/feedback/details/325421/syndicationfeed-load-fails-to-parse-datetime-against-a-real-world-feeds-ie7-can-read – tazyDevel

回答

8

看起來SyndicationFeed存在一個問題,即訪問者使用的access:restriction元素書。查看最近的帖子http://social.msdn.microsoft.com/Forums/ar/xmlandnetfx/thread/7045dc1c-1bd9-409a-9568-543e74f4578d

Michael Sun(MSFT)寫道:「剛剛看到Martin的文章!非常有幫助!我也做了一些關於這個問題的研究。它的RSS 2.0飼料,http://www.feedforall.com/access-namespace.htm。從這篇文章,似乎Rss20FeedFormatter是不是唯一一個不支持的元素。

我同意Martin使用XDocument(LINQ to XML)來解析RSS提要。您正在通過C#構建一些大型應用程序,Facebook C#SDK也可以提供幫助,http://facebooksdk.codeplex.com/

編輯:

但似乎Atomfeed沒有受到這個問題的困擾。因此,最簡單的解決方案 將使用此鏈接(http://www.facebook.com/feeds/page.php?id=202296766494181&format=atom10)。從而改變從rss20格式參數來atom10

HttpWebRequest req = WebRequest.Create(@"http://www.facebook.com/feeds/page.php?id=202296766494181&format=atom10") as HttpWebRequest; 
     req.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"; 
     using (Stream responseStream = req.GetResponse().GetResponseStream()) 
     { 
      using (XmlReader xr = XmlReader.Create(responseStream)) 
      { 
       SyndicationFeed feed = SyndicationFeed.Load(xr); 
      } 
     } 

其它替代是寫一個繼承的XmlTextReader overiding的ReadEndElement的方法,由所述信道的結束標記之後跳過任何元素。 (介意下面的代碼是不作任何保證,因爲我認爲自己還是個新手C#開發人員,請隨時糾正任何可能的錯誤)

public class FaceBookReader : XmlTextReader 
{ 
    public FaceBookReader(Stream stream) 
     : base(stream) { } 

    public FaceBookReader(String url) 
     : base(url) { } 

    public override void ReadEndElement() 
    { 
     string elementTag = this.LocalName.ToLower(); 

     base.ReadEndElement(); 

     // When we've read the channel End Tag, we're going to skip all tags 
     // until we reach the a new Ending Tag which should be that of rss 
     if (elementTag == "channel") 
     { 
      while (base.IsStartElement()) 
      { 
       base.Skip(); 
      } 
     } 
    } 
} 
+0

非常有用的信息,但使用XDocument解析是一個真正的痛苦,因爲那時我需要分別支持ATOM,RSS等...你可以想到的任何其他解決方案? –

+0

也許您可以加載XML,使用SyndicationFeed刪除無效的訪問標籤和重新加載? – tazyDevel

+0

通過將格式更改爲atom10來試用它,並且似乎有辦法讓它加載到SyndicationFeed – tazyDevel