4

System.ServiceModel.Syndicationライブラリを使用して RSS フィードを解析するコードを作成しました。

問題は、フィードの 1 つ (facebook によって提供される) について、応答の最後に次の行が表示され、シンジケーション ライブラリがフィードの解析に失敗することです。部:

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

フィードと解析ライブラリの両方が巨大企業 (それぞれ Facebook と Microsoft) から提供されているため、ここで何かが欠けていると確信しています。

どなたかお助けいただけませんか?それとも、XML の有効性に依存しない、より優れたパーサーですか?

PS これが私の RSS フィードの URL です:
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() で ...

4

1 に答える 1

8

SyndicationFeed は、facebook で使用される access:restriction 要素に問題があるようです。http://social.msdn.microsoft.com/Forums/ar/xmlandnetfx/thread/7045dc1c-1bd9-409a-9568-543e74f4578dの最近のスレッドを参照してください。

Michael Sun (MSFT) は次のように書いています。が 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);
            }
        }

もう 1 つの方法は、継承された XMLTextReader を記述して ReadEndElement メソッドをオーバーライドし、チャネルの終了タグの後の Element をスキップすることです。(私はまだ初心者の 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();
            }
        }
    }
}
于 2011-10-16T19:20:39.750 に答える