すっかり更新が滞ってしまいました。Visual Studio2005を出荷して一息つけるかと思いきや、TeamFundationやWinFx、そして次期バージョンのVisualStudioと、プロジェクトが目白押しです。
さて、今回はちょっとだけ、邪道なテクニックを考えて見ます。
XMLファイルを、DOMなどの特別な知識なしで扱う方法です。ここ数年、XMLのサポートは避けて通れないものになりつつあります。しかし、新しいことを覚えている暇がない、それほど大規模なデータをXMLで扱うわけでもないのに大掛かりな仕組みはいらない、と思っていらっしゃるかたもいるかと思います。そこで今回は、そういう方のために(場つなぎ的な方法ではありますが)、新しい知識なしでXMLファイルを扱う方法を取り上げて見ます
この方法は、大きなXMLファイルを使ってデータ処理をしたりするようなケースでは使い物になりませんが、たとえば、数十行程度のXMLファイルから、ちょっとしたデータを入力するだけならば使えるかと思います。
例: 次のようなXMLファイルを読み込みたいとします。<Data> <Input>C:\Test\NyuuryokuData.txt</Input> <Output>C:\Test\SyutsuryokuData.txt</Output> <Operation>Copy</Operation></Data>
3つのデータ(Input, Output, Operation)が格納されているだけの、非常に単純なXMLファイルです。この程度ならば、とりあえず普通にテキストファイルとして読み込んで、その中から必要な部分だけを取り出せばことが足りそうです。
そこで、以下のような方法でXMLファイルをテキストファイルとして読み込んで、必要な部分を取り出してみます。1.まずXMLファイルに格納されているすべてのデータをString型変数xmlbufに読み込む。2.たとえば<Input></Input>で囲まれているデータが必要な場合、<Input>という文字列を、xmlbufの中から探す。3.その<Input>の次の文字から先を必要なデータとみなして、そこから</Input>が見つかるまでをString型変数parameterに取り出す。4.parameterに欲しかったデータが格納されている。
・・・特に難しいことをするまでもなく、とりあえずXMLファイルを扱っている(ような気分??)の��同等な処理を実現できます。
以下が、それをC#でコーディングした例です。途中に改行やスペースが入っていても問題ないように、それらを空データに置き換えています。
static string get_parameter_from_xml(string xmlfilename, string target_tag) { string xmlbuf = ""; StreamReader sr = new StreamReader( xmlfilename ); while (sr.Peek() != -1) xmlbuf += sr.ReadLine().Replace("\r\n", "").Replace(" ", ""); sr.Close(); int p1 = xmlbuf.IndexOf("<" + target_tag.ToLower() + ">"); if (p1 < 0) return ""; p1 = p1 + target_tag.Length + 2; int p2 = xmlbuf.IndexOf("</" + target_tag.ToLower() + ">", p1); string parameter = xmlbuf.Substring(p1, p2 - p1 ); return parameter; }