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 や実体がうまく解決できない場合は、フォルダ名に日本語が含まれていないかを疑ってみるのも必要かもしれません。