<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>.NET Framework 3.x</title><link>http://blogs.wankuma.com/jitta/category/2149.aspx</link><description>WPF, WCF, WF, LINQ など</description><managingEditor>はなおか じった</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>はなおか じった</dc:creator><title>MSDN Magazine 非同期・並列祭り</title><link>http://blogs.wankuma.com/jitta/archive/2011/11/16/212878.aspx</link><pubDate>Wed, 16 Nov 2011 22:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2011/11/16/212878.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/212878.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2011/11/16/212878.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/212878.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/212878.aspx</trackback:ping><description>&lt;p class="p"&gt;MSDN Magazine の記事に非同期・並列プログラミングに関する記事が大量にあります。それらを抜き出してみました。古い順に並んでいるわけではないので注意してください。リンクは、別のウィンドウで開きます。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ff959205.aspx" target="msdn"&gt;非同期エージェント ライブラリによるアクターベースのプログラミング&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/magazine/4ce0f648-e76c-406c-9377-143708dee9c0" target="msdn"&gt;タスクを使って非同期プログラミングを簡単に&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/hh456392.aspx" target="msdn"&gt;Thinkin' About Async&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/hh456402.aspx" target="msdn"&gt;非同期のパフォーマンス: 非同期と待機のコストについて&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/magazine/0d2fab91-52a5-4a14-b5a3-6065d73253c5" target="msdn"&gt;await による一時停止と再生&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/hh456401.aspx" target="msdn"&gt;新しい Visual Studio Async CTP により容易になった非同期プログラミング&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/dd569760.aspx" target="msdn"&gt;依存関係のある操作を並列処理する&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc716528.aspx" target="msdn"&gt;非同期 WinHTTP&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc700359.aspx" target="msdn"&gt;WebClient の非同期 I/O&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc337900.aspx" target="msdn"&gt;非同期ストリーム処理&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc163323.aspx" target="msdn"&gt;C# で簡素化された APM&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ee336135.aspx" target="msdn"&gt;Visual Studio 2010 を使ったよりよいコーディング&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ee336027.aspx" target="msdn"&gt;Visual Studio 2010 の同時実行ビジュアライザーによるパフォーマンス チューニング&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ee309514.aspx" target="msdn"&gt;C++ プロジェクトで Concurrency Runtime を使用する 4 とおりの方法&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ee321571.aspx" target="msdn"&gt;例外を集約する&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/dd434652.aspx" target="msdn"&gt;VISUAL C++ 2010 と Parallel Pattern Library&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc872852.aspx" target="msdn"&gt;並列プログラミングの設計上の考慮事項&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc966710.aspx" target="msdn"&gt;new Thread(ReadEditorsNote).Start; yourAttention.WaitOne();&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc872851.aspx" target="msdn"&gt;偽共有&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc546569.aspx" target="msdn"&gt;同時実行の問題を特定するためのツールと手法&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc163329.aspx" target="msdn"&gt;マルチコア プロセッサでクエリを実行する&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc163340.aspx" target="msdn"&gt;マルチコア コンピュータ用にマネージ コードを最適化する&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ff960958.aspx" target="msdn"&gt;CLR 4.0 ThreadPool での同時実行の調整&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/gg232758.aspx" target="msdn"&gt;スレッド プールによるスケーラブルなマルチスレッド プログラミング&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/gg535673.aspx" target="msdn"&gt;データ処理: 並列処理とパフォーマンス&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/gg598924.aspx" target="msdn"&gt;SynchronizationContext こそすべて&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ff714587.aspx" target="msdn"&gt;Visual Studio 2010 におけるリソース競合の同時実行プロファイリング&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/dd252943.aspx" target="msdn"&gt;CLR でのスレッド管理&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc817398.aspx" target="msdn"&gt;マルチスレッド コードでよく見られる 11 の問題を解決する&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc721613.aspx" target="msdn"&gt;AsyncEnumerator のさまざまな機能&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc546608.aspx" target="msdn"&gt;AsyncEnumerator で簡素化された APM&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/ee336311.aspx" target="msdn"&gt;CLR 4 における運用向け診断機能の強化&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/dd419664.aspx" target="msdn"&gt;ThreadPool の順序実行&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc163327.aspx" target="msdn"&gt;新しいスレッド プール API でスケーラビリティを強化する&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc163328.aspx" target="msdn"&gt;Dispatcher を使用して応答性の高いアプリケーションを構築する&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/cc163352.aspx" target="msdn"&gt;デッドロック モニタ&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/gg309176.aspx" target="msdn"&gt;タスクによるスケーラブルなマルチスレッド プログラミング&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-jp/magazine/hh394144.aspx" target="msdn"&gt;The Thread Pool Environment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/212878.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>WinSNMP をラップ</title><link>http://blogs.wankuma.com/jitta/archive/2011/06/24/200239.aspx</link><pubDate>Fri, 24 Jun 2011 22:06:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2011/06/24/200239.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/200239.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2011/06/24/200239.aspx#Feedback</comments><slash:comments>459</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/200239.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/200239.aspx</trackback:ping><description>&lt;p&gt;　ちょっと使いたかったのだが、探すと無かったので、作ってみた。&lt;/p&gt;
&lt;iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="https://skydrive.live.com/embedicon.aspx/.Public/WinSNMP.NET.zip?cid=4d4a162589943324&amp;sc=documents"&gt;&lt;/iframe&gt;
&lt;p&gt;　使う場合は、自己責任で。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/200239.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>メモ：XmlSerializer で、名前空間の出力を抑制する</title><link>http://blogs.wankuma.com/jitta/archive/2011/01/19/196546.aspx</link><pubDate>Wed, 19 Jan 2011 22:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2011/01/19/196546.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/196546.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2011/01/19/196546.aspx#Feedback</comments><slash:comments>73</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/196546.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/196546.aspx</trackback:ping><description>&lt;p class="p"&gt;&lt;code&gt;XmlSerializer.Serialize&lt;/code&gt; メソッドを使うと、ルート要素に名前空間が追加されます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;root &lt;span style="color:red;"&gt;xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&amp;gt;
&amp;lt;/root&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class="p"&gt;これを、抑制する方法。&lt;/p&gt;
&lt;p class="p"&gt;オーバーロードされた &lt;code&gt;Serialize&lt;/code&gt; メソッドに、&lt;code&gt;XmlSerializerNamespaces&lt;/code&gt; クラスのインスタンスを受け取るものがあります。ここに &lt;code&gt;null&lt;/code&gt; を指定したり、何も追加していないインスタンスを指定しても、やはり規定の名前空間が出力されます。ステップインしてコードを見ると、&lt;code&gt;null&lt;/code&gt; や &lt;code&gt;Count&lt;/code&gt; が0の時は、規定の名前空間に置き換えるというコードが書かれていました。&lt;/p&gt;
&lt;p class="p"&gt;ところが、&lt;code&gt;XmlSerializerNamespaces&lt;/code&gt; クラスへの名前空間の追加については、なんのチェックもされていないようです（未確認）。ということで、空文字列の名前空間を追加したインスタンスを指定してあげます。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
&lt;span style="color:red;"&gt;XmlSerializerNamespaces ns = new XmlSerializerNamespaces();&lt;/span&gt;
// null または、個数が0個だと、規定の名前空間が追加されるので、1個にする。
&lt;span style="color:red;"&gt;ns.Add("", "");&lt;/span&gt;
XmlSerializer xs = new XmlSerializer(typeof(&lt;span style="font-style:italic;"&gt;TYPE&lt;/span&gt;));
using (StreamWriter writer = new StreamWriter(&lt;span style="font-style:italic;"&gt;fileName&lt;/span&gt;, false)) {
    xs.Serialize(writer, &lt;span style="font-style:italic;"&gt;object&lt;/span&gt;&lt;span style="color:red;"&gt;, ns&lt;/span&gt;);
    writer.Flush();
    writer.Close();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;root&amp;gt;
&amp;lt;/root&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p class="p"&gt;「&lt;code&gt;xmlns:xsd="http://www.w3.org/2001/XMLSchema"&lt;/code&gt;」を、「&lt;code&gt;xmlns="http://www.w3.org/2001/XMLSchema"&lt;/code&gt;」の様に出力させたいと思って、「&lt;code&gt;ns.Add("", "http://www.w3.org/2001/XMLSchema");&lt;/code&gt;」としたら、なんにも出力されなくなったので気がついたのでした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/196546.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>とりあえず、半分（カナ？）</title><link>http://blogs.wankuma.com/jitta/archive/2009/06/29/176771.aspx</link><pubDate>Mon, 29 Jun 2009 21:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2009/06/29/176771.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/176771.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2009/06/29/176771.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/176771.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/176771.aspx</trackback:ping><description>&lt;p class="p"&gt;とりあえず、RSS を読み込んで、それぞれの中身を取り出せるようになりました。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;まず、基本方針。XML を読み込んで、それが対応しているフォーマットであることを確認します。確認が出来たら、管理したい項目のみ取り出して、管理するのに都合の良いフォーマットに変換します。&lt;/p&gt;
&lt;p class="p"&gt;フォーマットの確認に、リフレクションを使います。一度使ってみたかったので、使うことにしました（ぉぃ）。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
using System.Xml.Linq;
using System.Reflection;
/// &amp;lt;summary&amp;gt;
/// インスタンスを生成します。
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name="document"&amp;gt;解析対象の XML ドキュメント&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;RSS フィードを解析する SyndicationAnalyzer のインスタンスを返します。&amp;lt;/returns&amp;gt;
/// &amp;lt;exception cref="System.NotSupportedException"&amp;gt;サポートしていないフォーマットの場合、発生します。&amp;lt;/exception&amp;gt;
public static SyndicationAnalyzer CreateInstance(XDocument document) {
    // サポートしている型を列挙
    Type[] supports = new Type[] { typeof(AnalyzerRss10), typeof(AnalyzerRss20), typeof(AnalyzerAtom) };
    foreach (var t in supports) {
        // それぞれの "CanParse" メソッドを検索
        var canParse = t.GetMethod("CanParse", BindingFlags.Static | BindingFlags.Public);
        // メソッドを実行
        bool result = (bool)canParse.Invoke(null, new object[] { document });
        if (result == true) {
            // サポートしているなら、
            // 規定のコンストラクターを取り出す
            var stcConstructor = t.GetConstructor(new Type[] { });
            // 規定のコンストラクターを呼び出して、インスタンスを生成する
            var instance = stcConstructor.Invoke(new object[] { });
            // XDocument 1つを引数に取るコンストラクターを取り出す
            var constructor = t.GetConstructor(new Type[] { typeof(XDocument) });
            // 規定のコンストラクターで生成したインスタンスを元に、引数ありコンストラクターを実行
            constructor.Invoke(instance, new object[] { document });
            // できたインスタンスを返す
            return (SyndicationAnalyzer)instance;
        }
    }
    throw new NotSupportedException();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p class="p"&gt;あまり、うれしくないです。&lt;code&gt;AnalyzerRss10&lt;/code&gt;、&lt;code&gt;AnalyzerRss20&lt;/code&gt;、&lt;code&gt;AnalyzerAtom&lt;/code&gt; は、それぞれ &lt;code&gt;static public bool CanParse(XDocument document)&lt;/code&gt; メソッドと、規定のコンストラクタ、XDocument 型を引数にとるコンストラクタが定義されているものとします。この、「定義されているものとする」という縛りがかけられないのが、不便。インターフェイスを定義して・・・そのインターフェイスを実装したクラスを一覧、って出来ないかなぁ？ここに上げたコードだと、新しい型が増えたとき、型情報の一覧に追加するだけで対応できます。if 文または switch - case 文で、分岐を増やすってのが、したくなかった。それだけの理由でリフレクションを使ってみたのだけど、あまりうれしくなかったです。&lt;/p&gt;
&lt;p class="p"&gt;とにかく、それらがあるもとして、&lt;code&gt;supports&lt;/code&gt; に、その型を列挙します。列挙されているものを順に、&lt;code&gt;CanParse&lt;/code&gt; メソッドを呼び出して、解析できるかどうかを判断します。このコードは &lt;code&gt;CanParse&lt;/code&gt; メソッドがあることを前提にしていますが、当然 &lt;code&gt;canParse&lt;/code&gt; の null チェックをしておくべきでしょう。&lt;/p&gt;
&lt;p class="p"&gt;引数のない規定のコンストラクタは「静的な」コンストラクタなのですが、引数のあるコンストラクタは「動的な」コンストラクタなのだそうです。知らなかった。動的なコンストラクタは、インスタンスがなければ呼び出せません。その為、一度規定のコンストラクタを検索して、呼び出してインスタンスを生成し、そのインスタンスを利用して、引数を持ったコンストラクタを呼び出しています。&lt;/p&gt;
&lt;p class="p"&gt;&lt;code&gt;AnalyzerRss10&lt;/code&gt;、&lt;code&gt;AnalyzerRss20&lt;/code&gt;、&lt;code&gt;AnalyzerAtom&lt;/code&gt; の親は、次のように定義します。&lt;code&gt;CanParse&lt;/code&gt; メソッドは、静的メソッドなので、ここには定義しません。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
abstract class SyndicationAnalyzer
{
    protected XDocument document;
    #region プロパティ
    /// &amp;lt;summary&amp;gt;
    /// ドキュメントが設定され、解析ができる場合は true を返します。
    /// &amp;lt;/summary&amp;gt;
    public virtual bool CanUse {
        get { return (this.document != null); }
    }
    /// &amp;lt;summary&amp;gt;
    /// 配信サイトのタイトルを取得します。
    /// &amp;lt;/summary&amp;gt;
    public abstract string FeedTitle {
        get;
    }
    /// &amp;lt;summary&amp;gt;
    /// 配信サイトへの URL を取得します。
    /// &amp;lt;/summary&amp;gt;
    public abstract Uri FeedLink {
        get;
    }
    /// &amp;lt;summary&amp;gt;
    /// 配信サイトの説明を取得します。
    /// &amp;lt;/summary&amp;gt;
    public abstract string FeedDescription {
        get;
    }
    /// &amp;lt;summary&amp;gt;
    /// 配信中のアイテムの個数を取得します。
    /// &amp;lt;/summary&amp;gt;
    public abstract int ItemCount {
        get;
    }
    public abstract string ItemTitle(int index);
    public abstract Uri ItemLink(int index);
    public abstract string ItemDescription(int index);
    #endregion
    public static SyndicationAnalyzer CreateInstance(XDocument document) {
        // 省略
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/176771.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>名前空間</title><link>http://blogs.wankuma.com/jitta/archive/2009/06/18/175910.aspx</link><pubDate>Thu, 18 Jun 2009 23:03:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2009/06/18/175910.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/175910.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2009/06/18/175910.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/175910.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/175910.aspx</trackback:ping><description>&lt;P class=p&gt;gtk2kさん、コードの提供ありがとうございました。早速、見てみました（エントリするのは遅かったけど、見たのは早かったんだよぅ）。そして、このあたりに注目。&lt;/P&gt;&lt;PRE class=code&gt;&lt;CODE&gt;
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
    foreach (XmlAttribute atr in xdoc.DocumentElement.Attributes)
        nsmgr.AddNamespace(atr.Name.IndexOf(":") == -1 ? "nn" : atr.Name.Split(':')[1], atr.Value);
    XmlNodeList itemList = itemList = xdoc.SelectNodes(ns[rn], nsmgr);
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P class=p&gt;おお、なるほど！XmlNamespaceManager クラスに名前空間を登録して管理させるのか。&lt;/P&gt;
&lt;P class=p&gt;で、これの、XML LINQ バージョンを探す・・・無い。。。XNamespace クラスというのが見つかったけど、これは、前回 "{namespace}local name" と書いたのと同じように、文字列から生成（暗黙変換）して、文字列と演算できるようになっているだけのように思われます。&lt;/P&gt;
&lt;P class=p&gt;え～？本当に？&lt;/P&gt;
&lt;P class=p&gt;検索して、行き着いたページ→&lt;A class=outerLink title=⇒microsoft.com href="http://msdn.microsoft.com/ja-jp/library/bb669152.aspx"&gt;方法 : 名前空間内の XML に対するクエリを記述する&lt;/A&gt;&lt;/P&gt;
&lt;P class=p&gt;う～ん。本当らしい。。。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/175910.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>「一郎さん！」と呼べば、Ｒ・田中一郎さんも鈴木一郎さんも返事する。</title><link>http://blogs.wankuma.com/jitta/archive/2009/06/10/174817.aspx</link><pubDate>Wed, 10 Jun 2009 22:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2009/06/10/174817.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/174817.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2009/06/10/174817.aspx#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/174817.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/174817.aspx</trackback:ping><description>&lt;p class="p"&gt;前回の失敗。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jitta：「XDocument って、RSS 2.0 しか解析してくれないの？！」&lt;br&gt;
aetosさん：「名前空間の指定がないからです。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class="p"&gt;むはー！単純明快な答え、ありがとうございます。&lt;/p&gt;
&lt;p class="p"&gt;ということで、仕様を当たります。前々回に、英語の仕様へリンクを張りましたが、日本語に訳してくださっている方がいらっしゃいました。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;&lt;a href="http://www.futomi.com/lecture/japanese/rss10.html" title="⇒futomi.com" class="outerLink"&gt;RDF Site Summary (RSS) 1.0 日本語訳&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;ここを見ると、RDF の名前空間に従うことがわかります。デフォルトの名前空間は &lt;code&gt;"http://purl.org/rss/1.0/"&lt;/code&gt; です。&lt;/p&gt;&lt;/li&gt;
 &lt;li&gt;&lt;p&gt;&lt;a href="http://www.futomi.com/lecture/japanese/rss20.html" title="⇒futomi.com" class="outerLink"&gt;RSS 2.0 Specification 日本語訳&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;ここを見ると、RSS 2.0 の要素は、RSS 0.9x との互換性のため、名前空間に定義しない、とあります。&lt;/p&gt;&lt;/li&gt;
 &lt;li&gt;&lt;p&gt;&lt;a href="http://www.futomi.com/lecture/japanese/rfc4287.html" title="⇒futomi.com" class="outerLink"&gt;RDF Site Summary (RSS) 1.0 日本語訳&lt;/a&gt;（Atom）&lt;/p&gt;
  &lt;p&gt;ここを見ると、Atom のデフォルト名前空間は &lt;code&gt;"http://www.w3.org/2005/Atom"&lt;/code&gt; であることがわかります。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;p class="p"&gt;済みません、これで、前々回にいただいているコメント&lt;q&gt;厳密には名前空間 URI も見た方がいいでしょう。&lt;/q&gt;がわかりました。&lt;/p&gt;
&lt;p class="p"&gt;名前空間にはバージョン番号が含まれることがあります。現に、Atom は「2005」というのが、2005年に決まったことを表しているでしょうし、RSS 1.0 は、「1.0」と入っています。ここで調べたかったのは、どのフォーマットの系統なのかということなので、そこまで細かいのが必要かなぁ？と思っていたのですが、要るのね。。。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;とりあえず、名前空間を指定すれば Element メソッドで取得できるか？確認します。&lt;/p&gt;
&lt;p class="p"&gt;XElement.Element メソッドに指定するのは、XName クラスです。しかし、XName クラスにはコンストラクタがありません。これは、String クラスからのコンバーターが用意されています。では、名前空間は、どうやって指定するのでしょう？名前空間を定義するときには、名前空間の省略名が定義できます。そういったもので、省略名が変わっていたら、指定できないのでは？&lt;/p&gt;
&lt;p class="p"&gt;ところが、XName クラスは、省略名を定義できません。全て XName クラスに展開されており、XName クラスでは、完全な名前空間を持っています。では、どのように参照するのでしょう？次のように指定します。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
XName name = "{&lt;span style="font-style:italic;"&gt;namespace&lt;/span&gt;}&lt;span style="font-style:italic;"&gt;local name&lt;/span&gt;";
&lt;/code&gt;&lt;/pre&gt;
&lt;p class="p"&gt;では、書き換えます。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
static IEnumerable&amp;lt;XElement&amp;gt; GetItems() {
    // とりあえず、全部 RSS 1.0
    string[] feeds = {
        "http://rss.rssad.jp/rss/itmatmarkit/rss2dc.xml",
        "http://rss.rssad.jp/rss/news/rss2dc.xml",
        "http://rss.rssad.jp/rss/fwin2k/rss2dc.xml",
        "http://rss.rssad.jp/rss/fdotnet/rss2dc.xml"
    };
    foreach (var str in feeds) {
        var feed = XDocument.Load(str);
        var channel = feed.Root.Element("{http://purl.org/rss/1.0/}channel");
        var items = channel.Elements("{http://purl.org/rss/1.0/}item");
        foreach (var item in items)
            yield return item;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p class="p"&gt;無事、動きました。&lt;span class="comment"&gt;別のプロジェクトで同じように書いて、期待通り動いていますが、このコードを確認しているわけではありません。&lt;/span&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/174817.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>XDocument って、RSS 2.0 しか解析してくれないの？！</title><link>http://blogs.wankuma.com/jitta/archive/2009/06/08/174540.aspx</link><pubDate>Mon, 08 Jun 2009 22:38:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2009/06/08/174540.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/174540.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2009/06/08/174540.aspx#Feedback</comments><slash:comments>31</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/174540.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/174540.aspx</trackback:ping><description>&lt;p class="p"&gt;&lt;A href="http://blogs.wankuma.com/jitta/archive/2009/06/04/174162.aspx"&gt;前回&lt;/a&gt;、更新通知に3つのフォーマットの系統があることを確認しました。とりあえず、ルート要素のローカル名を見れば、どの系統なのか判別できそうだとわかりました。次、配信されているものを取り出します。&lt;/p&gt;
&lt;p class="p"&gt;さて、サンプルを見ると、次のようになっています。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
static IEnumerable&amp;lt;XElement&amp;gt; GetItems() {
    string[] feeds = {
        "http://blogs.msdn.com/ericlippert/rss.aspx",
        "http://blogs.msdn.com/wesdyer/rss.aspx",
        "http://blogs.msdn.com/charlie/rss.aspx",
        "http://blogs.msdn.com/cyrusn/rss.aspx",
        "http://blogs.msdn.com/mattwar/rss.aspx",
        "http://blogs.msdn.com/lucabol/rss.aspx",
        "http://www.pluralsight.com/blogs/dbox/rss.aspx",
        "http://blogs.msdn.com/jomo_fisher/rss.aspx"
    };
    foreach (var str in feeds) {
        var feed = XDocument.Load(str);
        var items = feed.Root.Element("channel").Elements("item");
        foreach (var item in items)
            yield return item;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p class="p"&gt;肝心の所は、下の &lt;code&gt;foreach&lt;/code&gt; ブロック内にある、&lt;code&gt;feed.Root.Element("channel")&lt;/code&gt; のところです。ドキュメントを確認します。&lt;/p&gt;
&lt;blockquote&gt;&lt;p class="quoteSource"&gt;XContainer.Element メソッド より&lt;/p&gt;
&lt;p&gt;指定した XName の最初の子要素を (ドキュメント順に) 取得します。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class="p"&gt;つまり、&lt;code&gt;feed&lt;/code&gt; が示す XDocument インスタンスからルート要素を取り出し、ルート要素の &lt;code&gt;"channel"&lt;/code&gt; という名前のエレメントを取り出す、ということですね。&lt;/p&gt;
&lt;p class="p"&gt;とりあえず、他のフォーマットでも大丈夫か確認するため、このコードの &lt;code&gt;feed&lt;/code&gt; を書き換え、実行します。試しに http://www.atmarkit.co.jp/aboutus/rss/rss.html から、RSS 1.0 のフォーマットを選んでみます。&lt;/p&gt;
&lt;p class="p"&gt;例外が発生しました。NullReferenceException です。&lt;/p&gt;
&lt;p class="p"&gt;デバッガで止めて、クイックウォッチを起動します。ここに &lt;kbd&gt;feed.&lt;/kbd&gt; と入力すると、こんなところまでインテリセンスが働くのですね！続けて &lt;kbd&gt;feed.Root.Element("channel")&lt;/kbd&gt; と入力します。すると、null が返ってきています。&lt;/p&gt;
&lt;p class="p"&gt;データを確認します。ブラウザでアクセスし、ソースを表示します。抜粋します。&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;code&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
&amp;lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/modules/syndication/" xml:lang="ja"&amp;gt;
  &amp;lt;channel rdf:about="http://www.atmarkit.co.jp"&amp;gt;
    &amp;lt;title&amp;gt;＠IT&amp;lt;/title&amp;gt;
    &amp;lt;link&amp;gt;http://www.atmarkit.co.jp&amp;lt;/link&amp;gt;
    &amp;lt;description&amp;gt;ITエンジニア対象の技術解説情報＆コミュニティサイト&amp;lt;/description&amp;gt;
    &amp;lt;language&amp;gt;ja&amp;lt;/language&amp;gt;
    &amp;lt;dc:date&amp;gt;2009-06-08T03:00:13+09:00&amp;lt;/dc:date&amp;gt;
    &amp;lt;items&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p class="p"&gt;ルート要素である RDF:rdf の直下に channel があります。なぜ取れないのでしょう？&lt;/p&gt;
&lt;p class="p"&gt;ドキュメントを読み返し、いろいろいじっていると、&lt;kdb&gt;feed.Root.Nodes()&lt;/kdb&gt; だと、アクセスできることがわかりました。ここから NodeType を見ると XElement となっています。Nodes メソッドが返す XNode インスタンスを XElement にキャストすると、キャストが成功しました。ここからアクセスすることにします。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
/// &amp;lt;summary&amp;gt;
/// 指定されたエレメントに定義された、指定された名前を持つ最初のエレメントを取得します。
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name="rootElement"&amp;gt;エレメントを探す元になるエレメント&amp;lt;/param&amp;gt;
/// &amp;lt;param name="elementName"&amp;gt;検索するエレメントのローカル名&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;エレメントのノードから最初に見つかったエレメント&amp;lt;/returns&amp;gt;
static public XElement GetElementFromNodes(XElement rootElement, string elementName) {
    var nodes = rootElement.Nodes();
    foreach (var node in nodes) {
        if (node.NodeType == System.Xml.XmlNodeType.Element) {
            XElement element = (XElement)node;
            if (element.Name.LocalName == elementName) {
                return element;
            }
        }
    }
    return null;
}
&lt;/code&gt;&lt;/pre&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/174540.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>RSS 2.0 って、RSS 1.0 の上位じゃないのね！</title><link>http://blogs.wankuma.com/jitta/archive/2009/06/04/174162.aspx</link><pubDate>Thu, 04 Jun 2009 22:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2009/06/04/174162.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/174162.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2009/06/04/174162.aspx#Feedback</comments><slash:comments>77</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/174162.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/174162.aspx</trackback:ping><description>&lt;p class="p"&gt;ふと思ったこと。&lt;/p&gt;
&lt;p class="p"&gt;@IT 内 Insider.NET にある &lt;a href="http://www.atmarkit.co.jp/fdotnet/index/bbs/index.html" title="⇒atmarkit.co.jp" class="outerLink"&gt;Insider.NET 会議室 ディレクトリ&lt;/a&gt;って、探したい対象のカテゴリがわかっている場合、便利です。でも、新しい会議室の方には対応していません。&lt;/p&gt;
&lt;p class="p"&gt;じゃぁ、自分で作っちまおうか？&lt;/p&gt;
&lt;p class="p"&gt;でも、どうやって「新着情報」を知る？？？&lt;/p&gt;
&lt;p class="p"&gt;そうか、RSS があるじゃないか！最近、質問掲示板でも RSS が配信されるものが多いから、RSS を拾って更新のあったものを自分で分類していけばいいやん！！かつ、ブログだろうがニュースだろうが、何でも登録できちゃうぜ！！&lt;/p&gt;
&lt;p class="p"&gt;ってことで、RSS を調べた。したら、最初のバージョンが 0.9 だったらしい。次のバージョンが 0.91 で、ここからよりシンプルになることを目指した 2.0 と、0.9 を継承した 1.0 に分かれているらしい。&lt;/p&gt;
&lt;p class="p"&gt;さらに、マイクロソフト ソーシャルは、Atom って奴で配信されている。ってことで、ひとまとめに RSS といわれている XML ファイルには、（0.9, 0.91, 1.0）と、（2.0）と、（Atom）の3つのフォーマットがあることがわかった。&lt;/p&gt;
&lt;p class="p"&gt;う～ん。。。とりあえず、こんな感じか？&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;RSS を取得する URL を、ユーザーが指定する。&lt;/li&gt;
 &lt;li&gt;複数ある URL を定期的に巡回する。&lt;/li&gt;
 &lt;li&gt;XML の階層を調べて、フォーマットを特定する。&lt;/li&gt;
 &lt;li&gt;フォーマットによって、配信された記事をばらす。&lt;/li&gt;
 &lt;li&gt;記事 ID を持っているものはそれを、持っていない場合はリンク先 URL をキーにして重複チェックを行う。&lt;/li&gt;
 &lt;li&gt;新しいものについて、「新着」として登録する。&lt;/li&gt;
 &lt;li&gt;それぞれの記事を、人手で「分類」に分ける。&lt;/li&gt;
 &lt;li&gt;「分類」ごとに、HTML、または XML ファイルを作る。&lt;/li&gt;
 &lt;li&gt;FTP ソフトなどで、HTML または XML を HTTP サーバーにアップする。&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="p"&gt;RSS を取ってくる方法は、VS2008 のサンプルの中にあるので、ドキュメントを「RSS」でキーワード サーチしてください。そのサンプルでは、.NET Framework が対応している、RSS 2.0 が扱えます。「はてな」が配信しているのは RSS 1.0 なので、そのままでは使えません。また、マイクロソフト ソーシャルが提供しているのは Atom なので、やはり使えません。&lt;/p&gt;
&lt;p class="p"&gt;とりあえず、どのフォーマットか見分ける方法。&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;&lt;a href="http://web.resource.org/rss/1.0/spec" title="⇒resource.org" class="outerLink"&gt;RDF Site Summary (RSS) 1.0&lt;/a&gt;&lt;br&gt;ここを見ると、RSS 1.0 のトップ レベル要素は "rdf:RDF" であるとわかる。&lt;/p&gt;&lt;/li&gt;
 &lt;li&gt;&lt;p&gt;&lt;a href="http://www.rssboard.org/rss-2-0" title="⇒rssboard.org" class="outerLink"&gt;RSS 2.0 Specification&lt;/a&gt;&lt;br&gt;ここを見ると、RSS 2.0 のトップ レベル要素は "rss" であるとわかる。&lt;/p&gt;&lt;/li&gt;
 &lt;li&gt;&lt;p&gt;&lt;a href="http://www.ietf.org/rfc/rfc4287.txt" title="⇒ietf.org" class="outerLink"&gt;The Atom Syndication Format&lt;/a&gt;&lt;br&gt;ここを見ると、Atom Syndication Format のトップ レベル要素は "atom:feed" であるとわかる。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="p"&gt;このことから、トップ レベル要素のローカル名を見て判断すればよいでしょう。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
static public string WhichFormat(XDocument document) {
    var root = document.Root;
    if (string.Compare(root.Name.LocalName, "feed", true) == 0) {
        return "ATOM";
    } else if (string.Compare(root.Name.LocalName, "rdf", true) == 0) {
        return "RSS10";
    } else if (string.Compare(root.Name.LocalName, "rss", true) == 0) {
        return "RSS20";
    } else {
        return "UNKNOWN";
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;p class="p"&gt;で、次は、データの設計かな。&lt;/p&gt;
&lt;p class="p"&gt;つーか。。。@IT の会議室、RSS 配信してないし。。。&lt;/p&gt;
&lt;p class="p"&gt;あ。。。大文字小文字の区別をしないようにしたけど、XML って、識別するやんorz&lt;/p&gt;
&lt;p class="p"&gt;さらに。RSS 1.0 にしろ 2.0 にしろ、バージョンアップしたらどうするよ？要るのは一部だけで、全部をパースするわけじゃないから、まいっか。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/174162.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>