次の方法で共有


もっとも簡単に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;
        }