- PR -

DocumentBuilder#parseに渡すsystemIdで日本語名を含むURIが通らない

1
投稿者投稿内容
パンドラ
会議室デビュー日: 2005/05/13
投稿数: 3
投稿日時: 2005-05-13 13:08
Javaによるデスクトップアプリケーション(Windows環境)の開発中に
生じた問題について、質問させて頂きます。

XML文書をパース(ヴァリデーション有効)してDOMを得るために、

DocumentBuilder#parse(InputStream is, String systemId)

を使っています。XML文書のDOCTYPEでは外部DTD参照を行っているの
ですが、実際のDTDの置き場所はローカルマシン上にし、しかも
XML文書と同じフォルダではなく「メインクラスからの相対位置」に
置きたいため、DOCTYPEでは

<!DOCTYPE report PUBLIC "-//HOGE//DTD Hoge TestDef 1.0//EN"
"test.dtd">

のようにファイル名だけ指定し、プログラム中で上記の
parseメソッドで、

Document doc = db.parse(new FileInputStream(xmlFilePath), dtdURI);

としてベースとなるURIを指定しています。ここで dtdURI の値は、例えば

dtdURI = "file:/C:/JavaApp/dtd/";

などのようになっています。この場合、結果的にパーサーは、

「file:/C:/JavaApp/dtd/test.dtd」

を見に行き、期待どおりにXML文書をバリデートしてくれます。

JRE1.4.2 の環境では、上記の dtdURI に日本語を含むURIを指定しても
問題なく通っていました。

dtdURI = "file:/C:/Javaアプリ/dtd/";

ところが、同じものをJRE1.5 の環境で実行したところ問題が発生しました。
URIに日本語が含まれていると、parseメソッド実行時に、

java.net.MalformedURLException: no protocol: test.dtd

の例外が発生します。

調べたのですがまだ有力情報を見つけられません。
判ったこととしては、JRE1.5 からはパーサーがXercesに変更になっている
(以前はcrimson)ということくらいです。

何かお判りの方がいらっしゃいましたら、宜しくお願いいたします。


[ メッセージ編集済み 編集者: パンドラ 編集日時 2005-05-13 13:09 ]
パンドラ
会議室デビュー日: 2005/05/13
投稿数: 3
投稿日時: 2005-05-13 15:43
> 判ったこととしては、JRE1.5 からはパーサーがXercesに変更になっている
> (以前はcrimson)ということくらいです。

やはり、CrimsonだとOKでXercesだとダメのようです。
crimson.jarをクラスパスに入れて、VM起動時のパラメータで、

-Djavax.xml.parsers.DocumentBuilderFactory=
org.apache.crimson.jaxp.DocumentBuilderFactoryImpl

と指定してあげると、パーサー実装がCrimsonに切り替わって
JRE1.5の環境でも日本語を含むURIが通るようになります。

となると、今対象にしているような環境ではXercesは使えないということに
なるのでしょうか・・・
実際、日本語を含むURIなどというものを使ってる環境に問題があるわけですが、
Windowsだとそれが当たり前ですので・・・
パンドラ
会議室デビュー日: 2005/05/13
投稿数: 3
投稿日時: 2005-05-13 17:30
> crimson.jarをクラスパスに入れて、VM起動時のパラメータで、
>
> -Djavax.xml.parsers.DocumentBuilderFactory=
> org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
>
> と指定してあげると、パーサー実装がCrimsonに切り替わって

VMパラメータを指定しなくても、crimson.jarにクラスパスを通して
おくだけでOKでした。

とりあえずcrimson.jarを配布して応急手当することにします。。
(Xerces使えないのは問題ではありますが・・・)
1

スキルアップ/キャリアアップ(JOB@IT)