- - PR -
DocumentBuilder#parseに渡すsystemIdで日本語名を含むURIが通らない
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 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 17:30
> crimson.jarをクラスパスに入れて、VM起動時のパラメータで、
> > -Djavax.xml.parsers.DocumentBuilderFactory= > org.apache.crimson.jaxp.DocumentBuilderFactoryImpl > > と指定してあげると、パーサー実装がCrimsonに切り替わって VMパラメータを指定しなくても、crimson.jarにクラスパスを通して おくだけでOKでした。 とりあえずcrimson.jarを配布して応急手当することにします。。 (Xerces使えないのは問題ではありますが・・・) |
1