環境設定ファイルに XML を使いたい (Delphi 2009 以降)
環境設定を保存するには幾つか方法があります。
XML を環境設定ファイルに使えば、どちらの欠点もカバーできるのですが、XML を扱う TXMLDocument はとにかく操作が面倒で、慣れないと様々なエラーを拝む事になります。本格的に XML を使いたい訳ではなく、単に環境設定ファイルとして使いたいだけなのに、面倒で面倒で仕方ありません。
RTL にはレジストリを Ini ファイルのように扱う TRegIniFile というクラスがあります。そこで同様に、"XML を Ini ファイルのように扱うクラス" を作ってみました。コードは Delphi 2009 以降が対象となっています...動作対象が Windows 2000 以降なら、MSXML の心配をしなくていいからです。
|
同様の実装は以前から存在しますが、あまりにも簡易すぎたり、あまりにも重装備だったりで、環境設定ファイル用に使うには向かないように思えましたので、車輪の再発明と相成った訳です。
環境設定を書き出すコードは以下のようになります。
|
実際に書き出された XML はこうなります。XML は "Name=Value" 形式ではないので、Ini ファイルや レジストリに慣れた方からすると違和感があるかもしれません。
|
XML は UTF-8 で書き出されます。
環境設定を読み込むコードは以下のようになります。
|
とても簡単ですね。
|
実際に書き出された XML はこうなります。
|
ここまでは Ini ファイルでもなんとか実現できます。
|
実際に書き出された XML はこうなります。
|
IXMLNode を透過的に扱えるので、ある程度複雑な事もこなせます。"ParentNode: IXMLNode" を引数に持つメソッドは ParentNode を指定しなかった場合、OpenNode() のカレントノードが親になりますが、指定した場合には指定したノードを親とします(カレントは移動しません)。これは同一のノードに同じ名前 (TagName) の子ノードがあっても処理できる事を意味します。レジストリでも実現できない処理です。
わざわざ、子ノードを作って値を保存するのは冗長に思えるかもしれません。Attribute に値を保存すればいいからです。ただ、TXMLIniFile は利便性のため、Attribute に "Type" という属性を付加しています。この属性は、GetNodeType() で取得でき、格納された値の種類を表しています。
|
また、ノード名 (TagName) には空白を含める事ができません。"<Delphi 2010></Delphi 2010>" のように空白が含まれると、Attribute との境界がわからなくなるからです。Ini ファイルやレジストリでは空白を含む名前が使えますので、この点には注意が必要です。
引数 "TagName: string" にはノード名が指定でき、"LocationPath: string" には、相対/絶対 の"ロケーションパス (XPath)" が指定できます (但し、"." や ".." は未実装)。
XE 以降には Embarcadero 謹製の TXMLIniFile / TXmlMemIniFile があります (XMLIniFile 名前空間)。
See Also:BACK |