Archive for 8月, 2007

LINQ to XMLでATOMを読む

ハマった。

LINQ to XMLのサンプルコードとしてRSSフィードリーダが作られていたので、ではそのコードでATOMフィードを読んでみようとしてみると、フィードの内容が一切取り出せない。

おかしいなぁ、と2日間情報を探し回ったあげく、ようやっと「MSの想定する処理方法」のひとつが見つかった。

RSSのコードのまま取り出せなかった理由は、ATOMフィードがデフォルトネームスペースを設定しているためだった。LINQはXPathを理解するのだが、XPathの仕様としてXML要素を取り出す際には、デフォルトネームスペース内の要素でさえ、いちいちネームスペースを指定せねばならない様子。

結果、LINQ to XMLでは次のようなコードになる。

  XDocument doc = XDocument.Load(@"http://satoshi.blogs.com/life/atom.xml");
  XNamespace nsDef = "http://www.w3.org/2005/Atom";

  var feeds = from feed in doc.Descendants(nsDef + "entry")
              select new {
                Title = feed.Element(nsDef + "title").Value,
                Summary = feed.Element(nsDef + "summary").Value
              };
  foreach (var feed in feeds) {
    Debug.WriteLine(string.Format("{0}\n\t{1}", feed.Title, feed.Summary));
  }

もしくは、

  XDocument doc = XDocument.Load(@"http://satoshi.blogs.com/life/atom.xml");

  var feeds = from feed in doc.Descendants("{http://www.w3.org/2005/Atom}entry")
              select new {
                Title = feed.Element("{http://www.w3.org/2005/Atom}title").Value,
                Summary = feed.Element("{http://www.w3.org/2005/Atom}summary").Value
              };
  foreach (var feed in feeds) {
    Debug.WriteLine(string.Format("{0}\n\t{1}", feed.Title, feed.Summary));
  }

要素指定部分で毎度ネームスペースを指定するのは手間がかかるので別解が欲しいところだが、今のところは見つからない。


Silverlightアプリケーションのデバッグ

Visual Studio 8.0 β2からSilverlightアプリケーションをする方法として一番簡単なものは、Silverlightプロジェクトをアクティブにしてデバッグ実行すること。Silverlightアプリケーション作成ウィザードで生成されたテストページをてブラウザがローカルファイルとして読み込み、ブラウザとデバッガが通信してデバッグできる。

しかし、BrowserHttpWebRequestクラスで通信しようとすると問題が起きる。クロスサイトスプリクティング防止のため、ローカルファイルとして読み込まれたページから同クラスを用いた通信はできないよう制限されているので、正常ロジックを通すことができない。

そこで、テストページをローカルファイルとしてではなくHTTP通信経路で取得するようにして、そのページをデバッガで追うための手順をwebで探した。

ところが本家の手順を踏んでもまっさらなページが表示されるだけでデバッグできない。他の情報を当たってもテキトーな方法を書いたものしかみつからない(“ここ”など)。困ってるのは自分だけなのなぁ、と試行錯誤と情報の断片の掻き集めとを続けて、ようやくそれらしい方法がわかった。

使用したもの

(以下は http://silverlight.org/GetStarted/ からリンクが張られている)

  • Visual Studio 2008 β2
  • Silverlight 1.1 Alpha Refresh
  • Microsoft ASP.NET Futures (July 2007)
  • Microsoft Silverlight Tools Alpha Refresh for Visual Studio (July 2007)

デバッグ手順

  1. Visual StudioでSilverlightプロジェクトを含むソリューションを開く

  2. ソリューションエクスプローラで、ソリューション項目を右クリックして、[Add][New Project...]を選択

  3. ASP.Net AJAX Features Web Applicationプロジェクトを作成

  4. ソリューションエクスプローラで、作成した ASP.NET プロジェクト項目を右クリックして、コンテキストメニューから Add Silverlight Link を選択

  5. 確認ダイアログで OK をクリック

  6. default.aspx をダブルクリックしてコードをエディタに表示させる

  7. <body>開始タグに続けて次のコードを追加

        <asp:Xaml runat="server" XamlUrl="~/Page.xaml" Width="640" Height="640" />
    
  8. ASP.NET プロジェクト項目で右クリックし、Properties をクリック

  9. Webページで、Specific Port を選択し、適当なポート(22000)を指定して通信ポートを固定

  10. Silverlightアプリケーションの通信部分のコードに記述したURLをテスト用に書き換える。(http://example.com/data.xml -> http://localhost:22000/data.xml)

  11. ASP.NET プロジェクト項目で右クリックし、Set as Startup Project をクリック

  12. default.aspx を右クリックして、Set as Start Page をクリック

  13. F5でデバッガ起動。Silverlight デバッグを有効にしたいかどうか確認されたら、Yes をクリック

これでSilverlightアプリケーションのコードをデバッガで追えるようになっているはず。


Copyright © 1996-2010 During The Prime Hacking Hours. All rights reserved.
iDream theme by Templates Next | Powered by WordPress