かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Windows Phone 7でRSSの読み込み

さくっとですが、以下のような動きをするRSSリーダーもどきを作ってみました。

ソースコードは以下からダウンロードできます。
OkazukiRssReader.zip

とりあえずMVVMパターンとかいう作るのがめんどくさいのは置いといて、素直にイベントハンドラに処理を書いています。
肝になるのは、以下のコードかな?

var ns = XNamespace.Get("http://purl.org/rss/1.0/");
var rssUrl = textBox1.Text;
var req = HttpWebRequest.Create(rssUrl);
Observable.FromAsyncPattern<object>(
    req.BeginGetResponse,
    req.EndGetResponse)()
    .OfType<HttpWebResponse>()
    .Select(res =>
        {
            var doc = XDocument.Load(res.GetResponseStream());
            return doc.Root.Descendants(ns + "item");
        })
    .SelectMany(items => items)
    .Select(element =>
        new RssInfo
        {
            Title = element.Element(ns + "title").Value,
            Url = element.Element(ns + "link").Value
        })
    .ObserveOnDispatcher()
    .Subscribe(rss => listBox1.Items.Add(rss),
        ex => 
        {
            MessageBox.Show(ex.Message);
        },
        () => { });

Reactive Extensionを使って非同期処理だけどさくっと書いてます。
レスポンスを取得してXDocumentにしてitemタグだけ抽出したあとにRssInfo型(独自定義)に変換して、UIスレッドでListBoxに追加してます。
何かエラーがあったら画面に出すようにもしています。(動画で最初にボタンを押したときのような動きをする)

適当に作るぶんには割合簡単にできます。