XMLファイル内をC#で駆け巡れ!

と、なんか凄い自由気ままそうなタイトルを付けてみた物の、
単純なXMLファイルでさえ、C#上からのコントロールが効かずに四苦八苦している。
というのも、最近、またHiyoriBotに手をつけてしまい、その勢いで、せめて

・OP配布対象をIDで検索、マッチした場合、その要素内の不特定多数のname要素をチェックしていき、マッチするものがあれば1(true)を返す。

・上記が出来た暁には、現状、IRC接続先の
サーバーアドレス、ポート、チャンネル等をコード内部に配列で記述してしまっているので、
それを、XMLとして外部化したい。
 
という二つの事をしたいのだが、どうにもこうにもXMLを読む際の各メソッドの動きがいまいち理解できないでいる。

要するに。

<member USERID="~deeps">
<name>deepspeed</name>
<name>deepstan</name>
</member>

とまぁ、簡単なメンバ情報を書いた。
後は、USERIDで検索させて、~deepsが引っ掛かったら、その中の<name>を順々に見ていって、
どれか一つでもJOINしてきた人のニックネームと一致するものがあれば、OPなるとを配布させる。という事なのだけれども、
まず第一に、XMLを扱うメソッドやらクラスが豊富すぎてなにがなんだかわからない。
そういった用途に使えそうなものを、ざっと挙げてみるだけでも、

XmlDocument クラス 
 XML ドキュメントを表します。
XmlNode クラス
 XML ドキュメント内の単一のノードを表します。
XmlNodeList クラス
 順序の付いたノードのコレクションを表します。
XmlTextReader クラス
 XML データへの高速で非キャッシュの前方向アクセスを提供するリーダーを表します。
XPathDocument クラス
 XSLT を使用して XML ドキュメントを処理する、高速の読み取り専用キャッシュを提供します。
XPathNavigator クラス…
 カーソル モデルを使用して任意のデータ ストアからデータを読み取ります。

まだまだありそうだ。
とりあえず、以前は XmlDocumentと、XmlNode、XmlTextReader クラス、三つを使用していたのだが、こいらどうみても、コードがスマートじゃない。
何重ものネストを掘り、whileやらifやら、たかが二つの要素を検索して比較するだけで、
これだけごちゃごちゃになるのは異常ではないだろうか。(書き方がおかしいとも言う
その上、実は初めて知ったのは、XmlTextReaderは、非キャッシュだとか。
どうも、暫く放置した後に、ひょこっと、人が入室してくると、HDDがカリカリッと動く訳だ。
そういうことなんだろうと思う。多分。

とすると。
どうも、高速でよりXMLを扱うに相応しそうなクラスは、XPath系となりそうだが、こいつにも若干気になるところが。
検索をするのに、条件の指定が、XPathそのままでは使えず、一度
 XPathExpression expr;
 expr = nav.Compile("/bookstore/book/@bk:ISBN");
の例のように、手順としては、XPath式を一度 Compile し、それを XPathExpression とし、そのExpressionを元に、
XPathNavigatorクラスを使ってカーソルを移動させる。という感じっぽい。
その上、これは憶測でしかないが、キャッシュし、高速な読み書きを。としているからには、
どの時点でXMLファイルがメモリ上に格納されるのかが心配。
OP配布のリストなんて、人がHN変えたり、新たな人に配らせるために書き直す/書き足す事はBot起動中でも出来なければ、
その都度、Bot再起動なんぞやってられん。
まぁ、オブジェクト指向とかゆーくらいだから、クラスを呼んだ時にキャッシュして、クラス抜けたら破棄するのかな。
そうであってほしい。
うわぁ。投げ出しそう…。(ぉぃ

##追記##
どうも、XPathNavigatorは検索にかなりの時間が掛かるような場合のみ使うようなものらしい。
普通はXmlDocumentで良いみたいだ。むう…。