Xerces と DOCTYPE と日本語フォルダ

数日前、フォルダ名に日本語を使用したがために、Xercesで激しく嵌りました・・・

XML では DOCTYPE 中のシステム識別子などを以下のようにプロトコル名を省いて記述することができます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM 'hoge.dtd'>

この場合、'hoge.dtd' は DOCTYPE が宣言されているXMLファイルからの相対パスとして解釈されて読み込まれます。*1

このとき、本体の XML ファイルを示す絶対パス(file://c:/data/hoge.xml とか)に日本語が含まれている場合、Xerces は hoge.dtd の読み込みに失敗します。hoge.dtd相対パスとして解釈してくれず、プロトコルが指定されていないというメッセージとともに例外が送出されてしまいます。
絶対パスがすべて ASCII 文字で構成されていたり、Xerces ではなく Crimson が使用されている場合は問題無く動くため、Xerces のバグなのかも知れません。

Xerces を使用している場合に DTD や実体がうまく解決できない場合は、フォルダ名に日本語が含まれていないかを疑ってみるのも必要かもしれません。

*1:相対パスとして読み込むためには、XML 本体の読み込み時にシステム識別子を指定しておく必要があります。