ハマった。

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));
  }

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