MSXMLが不正なコードを含むXMLファイルをどう扱うか、という話です。
MSXMLのバージョン次第で扱いが違いますので、夫々のバージョンにおける扱いを調べてみました。
調べたMSXMLのバージョンは2.6、3.0、4.0の3つです。
不正なコードを含むXMLファイル(RSSですが)として、以下のURLのファイルを使いました。色々と試して見たい方はご利用下さい。
http://www.sutosoft.com/test/heimdallr/testrssmiss_2.xml
XMLファイルの中に、0x1BというEscapeのコントロールコードが含まれています。
MSXMLのloadを使用して上記XMLファイルを読み込んだときの結果と、saveを使用して書き込んだときの結果は以下のようになりました。
MSXMLバージョン | load | save |
MSXML 2.6 | ○ | ○ |
MSXML 3.0 | × | ○ |
MSXML 4.0 | × | × |
MSXML2.6は平和です。不正なコードが含まれていても何事もなかったように処理してしまいます。
このやり方は、MSXML2.6の世界に閉じていれば安泰なのですが、MSXML2.6で作成したデータを、他のライブラリで読み込もうとしたときにはトラブルが発生してもおかしくありません。
MSXML3.0は、不正なコードを含んだファイルを作成できるのに、読み込めないので、自爆の可能性を秘めています。
うっかり不正なコードを含んだファイルを作成してしまうと、自分でも読み込めなくなってしまいますので、さっき作成したデータが読み込めない・・・という事態になることがあります。
MSXML4.0は厳しめの平和です。不正なコードを含んだファイルを作成できないようになっています。
具体的には、不正なコードを含んだテキストノードを作成しようとしたところで失敗します。
MSXML4.0を呼び出すアプリケーションが、テキストノード作成に失敗することを考えていないような仕様になっていると、アプリケーションが強制終了する場合があるでしょう。
不正なコードが含まれてしまっていることをどれくらい早く検出できるか、という観点で考えると、MSXML4.0 > MSXML3.0 > MSXML2.6 です。動作としてはMSXML4.0が一応理想ということにはなると思います。
しかし、MSXML4.0は、Internet Explorer6に同梱されていませんので、現時点では使わない方が良いでしょう。
ということで、不正なコードが紛れ込まないよう注意しながらMSXML3.0を使うときは使いましょう。
なお、ここでは「不正なコードを含むXMLファイル」と書きましたが、MSXML3.0や4.0で読み込みや書き込みができないXMLファイルの条件は、明確には分かっていません。今回挙げた例は、一例です。
以下余談。
実のところは、他のアプリケーションとXMLファイルをやり取りするようなことがない場合は、MSXML2.6は最後まで不正な文字コードが含まれていることを検出できず、具体的な問題がなにも発生しないことも多いでしょう。ですので、MSXML2.6の仕様はユーザメリットがあるのです。一番ユーザメリットがないのは、実はMSXML3.0なのです。
入出力ライブラリを作るときは、MSXML3.0のように、出力はできるけれど入力はできない、ということにならないよう注意しましょう。