かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

ローカルにあるRSSのXMLファイルからSyndicationFeedを作る

WinRTでRSSを扱おうと思ったら、SyndicationClientを使います。とても簡単に読み込みが可能です。

var client = new SyndicationClient();
var feed = await client.RetrieveFeedAsync(new Uri("http://d.hatena.ne.jp/okazuki/rss"));

ただ、ちょっとした理由*1からオフラインの状態でもRSSを読み込ませたいと思ってローカルにRSSを保存したのを置いておいたときにSyndicationClientのRetrieveFeedAsyncにfile://とかms-appx://とかms-appdata://とかで始まるURIを与えてもアクセスできない的なエラーになっちゃいます。ということでネットワーク上のRSSしか読み込めないのか…とあきらめてたらSyndicationFeedクラスに以下のようなメソッドがありました。

public void LoadFromXml(XmlDocument feedDocument);

これは勝てそうな気がする!!ということでコンテンツとしてプロジェクトに含めたxmlを読み込ませるためのコードは以下のような感じになりました。プロジェクトのAssetsフォルダにokazuki_rss.xmlを置いた場合のコードになります。

var feed = new SyndicationFeed();
var file = await StorageFile.GetFileFromApplicationUriAsync(
    new Uri("ms-appx:///Assets/okazuki_rss.xml"));
feed.LoadFromXml(await XmlDocument.LoadFromFileAsync(file));

手順としては、ms-appx://ではじまるURIでアプリケーションのコンテンツのStorageFileを取得して、XmlDocumentのLoadFromFileAsyncでXmlDocumentにして、それをSyndicationFeedのLoadFromXmlに渡してます。
OK。ばっちり。

*1:開発環境がオフラインでも疑似的にRSS読み込ませたかったのです…