もっとも簡単にXMLファイルを扱う方法
すっかり更新が滞ってしまいました。
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;
}