C#でXMLのXPathよる読み書きとバージョンアップ

本記事は、[C#での設定ファイル管理とパラメータのバージョンアップ]の続きとして、XMLのXPath(DOM)による設定情報やパラメータの扱いについて記載します。この記述は.netがリリースされたときからの技術で、初期の時はかなり流行っていました。

XPathによる読み書きのシンプルな仕組み

C#でXPath(DOM)によるXMLを扱うための.netのクラスとしてXmlDocumentが用意されています。このXmlDocumentクラスを使うことで、楽にXMLを読み込み、書き込むことができます。

サンプルで使うXML

XPathによるXML書き込み

XmlDocumentクラスを使い、CreateXmlDeclaration(),CreateElement()を行い、それぞれに対し、子ノードのためAppendChild()します。最後は、Save()関数にファイル名を指定します。

下の図にXMLとソースコードの関連付けをしてみました。

XPathによるXML読み込み

XPathで読む方法はいろいろ応用がありえますが、以下のサンプルに2つの方法を書いてみました。方法1と方法2は同じ結果になります(ノード名有無はありますが、同じ値が取得できます)。

読み込みもXmlDocumentクラスを使い、Load()でファイル指定でXMLを一度読み込んだ後、SelectNodes()でリストを取得し、リストの内のノードを一つずつ取り出す仕組みになります。

下の図にXMLとソースコードの関連付けをしてみました。

方法1,方法2ともにリストから取り出すことになります。方法1で18行名、19行目で配列を直接見ていますが、わかりやすくするためであり、本来ならfor文か、foreach文で対応することになります。

どちらが使いやすいかは、プロジェクトの状況によると思いますが、管理人の場合は、方法2を好みます。XMLから読み込み、それをクラスに割り当てるときに、楽になるメリットのためです。実際のことは、本記載の最後の全体サンプルに書きます。

XPathによる読み込みとクラス関連付け

サンプルで使うXML

読み込みとクラスのサンプル

基本的な考えは上で説明したシンプルな仕組みと変わりありません。XMLリストとクラスのリスト、そして、各メンバーを割り当てることで実現します。

パラメータバージョンアップにおけるXPath管理による影響

XPath(DOM)によって設定情報を管理する時は、アプリケーションのバージョンアップによってパラメータが変更されたとしても、影響は少ないです。サンプルを見ればわかるように、XMLファイルの中身とアプリケーションで持っているクラスは、完全一致しないです。そのため、XMLから読み込んだ情報をクラスに詰め替える作業を行いました。この作業があるとは、パラメータバージョンアップが行われても、直接影響をうけることはないことになります。

ただ、どうしても、パラメータバージョンアップの内容によって、バージョンアップが必要になる場合があります。その場合は、XMLファイルの中にXMLフォーマットバージョンなどを持ち、必要に応じてバージョンアップを行うと良いです。

バージョンアップを考慮したXMLファイルの例

バージョンアップを考慮したXPathの読み書き

XMLからの読み込みの場合、src3.1 XMLの例であるように「AppInfo」のElementを持ちます。

  • 読み込みの時

src.3.2の20行~31行目にあるように、読み込みの時、まず、この部分を読み込み、バージョンアップが必要であるかを判断します。もし、バージョンアップが必要であれば、それに該当する処理をします。

  • 書き込みの時

src.3.2の45行~60行目にあるように、XMLに書き込む際は、常に新しいフォーマットバージョン(現在、起動しているアプリケーションが求めるXMLのファイルバージョン)でXMLを作成します。

まとめ

XPath(DOM)によるXMLファイル管理は、XMLファイルとアプリケーションのクラスの間に変換作業が必要であること、そして、XML構造を考えながらプログラミングしなければならいデメリットがあります。特にXML構造を考えながらプログラミングすることは、面倒な作業になる場合が多いです。

ただし、アプリケーションのバージョンアップでパラメータバージョンアップがあったときは、INIファイルによる管理のように少し楽になるメリットがあります。