.netでは、プログラム本体を変えることなく環境に依存するような事柄を変更したい場合、
外部の設定ファイルをよく利用する。
その際たるものが ASP.netにおける Web.Config。
ただ、この Web.Configファイルは一見 XMLのように見えるのだけれども、
部分的には肝心な点で XML的な使い方ができない。
例えばの事例で・・・。
本来 XMLには ENTITYと言われる機能がある。
これが何かと言うと XML中に記述した『仮の名称』で『実態の参照』ができる機能である。
これでは何のことやらさっぱりわからないが、身近な例としては HTML(XHTML)の
“<” → 『<』 とか “>” → 『>』 とか “&” → 『&』
などが予め定義されているのもこの ENTITYの機能だったりする。
その ENTITYの機能を使うと、本来なら以下のような記述ができるはずなのだ。
hoge_test.xml
<!DOCTYPE hoge [
<!ENTITY foo "foo_string">
<!ENTITY bar SYSTEM "bar_file.xml">
]>
<hoge>
&foo;
&bar;
</hoge>
bar_file.xml
<ukeke>質実剛健</ukeke>
この hoge_test.xmlを、例えば IEでダブルクリックすると以下のように表示される。
<!DOCTYPE hoge (View Source for full doctype...)>
<hoge>
foo_string
<ukeke>質実剛健</ukeke>
</hoge>
つまり &foo; は勝手に定義した文字列 foo_string に置き換えられて使われ、
&bar; (SYSTEMを付けて定義) は別途用意した XMLファイルの中身に置き換えられる。
これが『仮の名称』で『実態の参照』をしているということなのだ。
この機能が使えれば“とりあえず”Web.Configにじゃかじゃか記述してしまっている定義も
別ファイルに分けることができるので混乱しなくてすむし、パスの定義なんかも
もっとスムーズに記述できるようになるのではないか?
Web.Config
<!DOCTYPE hoge [
<!ENTITY DataPathRoot "C:\localtest\">
<!ENTITY frmXX010Config SYSTEM "XX010Config.xml">
<!ENTITY frmXX010Config SYSTEM "XX010Config.xml">
]>
<configuration>
(略)
<add key="CSVFilePath" value="&DataPathRoot;csv\" />
<add key="PDFFilePath" value="&DataPathRoot;pdf\" />
&frmXX010Config; <!-- XX010 固有の定義-->
&frmXX020Config; <!-- XX020 固有の定義-->
・・・しかし、実際にはこの記述は Web.Configでは使えない。
Web.Configへの記述の仕方が悪いのか、読ませ方(コードの書き方)が悪いのか、
もともと Web.Configを読む XMLパーサが貧弱なのか、まだ継続調査中なのだが、
使いたいよなぁ・・・。