- - PR -
parse(絶対パス)とparse(new InputSource(new FileInputStream(絶対パス)))の長短
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2003-09-25 11:36
こんにちは
現在、xml文書の妥当性検証を確認するコードを書いております 【環境】win_xp jdk1.4.1.04 xerces1.4.4 ------------------------------------------------------------- import org.apache.xerces.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; DOMParser parser = new DOMParser(); 1.parser.parse(絶対パス); 2.parser.parse(new InputSource(new FileInputStream(絶対パス))); ----------------------------------------------------------- 上記のコードで1.2.それぞれ問題があります 1のコード...日本語が絶対パス内に含まれている場合対応できない (SaxException で [file c:\犬\猫.xml not found]) 2のコード...外部DTD参照記述が「相対パス」の場合対応できない (<!DOCTYPE Test SYSTEM "../Test/test.dtd">) (SaxException で [file "../Test/test.dtd not found]) 単純にストリームですから、自分のパスをもっていないからでしょうか。 逆に長所 1のコード...外部DTD参照記述が「相対パス」でも対応できる 2のコード...日本語ファイル名にも対応できる 最終的に ・日本語ファイル名、フォルダ名のファイルに対応したい。 ・外部DTDへの参照記述が絶対パス・相対パス両方の場合に対応したい。 可能なのでしょうか。ご存知の方、アドバイスお願いします。 よろしくお願いいたします。 [ メッセージ編集済み 編集者: やべっち 編集日時 2003-09-25 11:37 ] |
|
投稿日時: 2003-09-25 11:59
<!DOCTYPE Test SYSTEM "../DTD/test.dtd">
<!DOCTYPE Test SYSTEM "file://C:/test.dtd"> の両方に対応。 >java Test C:\犬\犬.xml にも対応です。あぁ。。。 [ メッセージ編集済み 編集者: やべっち 編集日時 2003-09-25 12:00 ] |
|
投稿日時: 2003-09-25 20:54
InputSource uri = new InputSource(new FileInputStream(path));
uri.setSystemId(path); System.out.println(uri.getSystemId()); parser.parse(uri); uri.setSystemId(path); のpathに日本語(c:\犬.xml)が入っていると だめのようです。英数字のみならうまくいっています。 |
|
投稿日時: 2003-09-26 00:46
私の場合はSAX(xerces2.3?)ですが、同じ問題で悩みました。
環境が違うので直接の解決にはならないかもしれませんが、参考までに。 大体こんな感じだったと思います。 -------------------------------------------------------------------------------- public Handler extends DefaultHandler { // パース対象のxmlファイルがあるディレクトリをセットしておく private String dir; public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { String absolute = null; URI uri = new URI(systemId); if (uri.isAbsolute()) { // 絶対パス absolute = uri.getPath(); } else { // 相対パス // xmlのあるディレクトリを基準に、相対パスを絶対パスに変換する File f = new File(dir, systemId); absolute = f.getCanonicalPath(); } InputSource source = new InputSource(new FileInputStream(absolute)); source.setSystemId(absolute); return source; } } -------------------------------------------------------------------------------- resolveEntiryというのは、外部ファイルを参照するときに呼ばれます。 上記のように無理やり解決させました。 #本当は、もっとスマートな解決方法があるのかもしれませんが・・・。 DOMは使ったことがないのでわかりませんが、DOMにも同じようなものがあれば 解決できるかもしれません。 また、jdk1.4を使っているならば、SAXイベントをDOMに変換する方法もあるので、 それを組み合わせればできそうな気がします。 |
|
投稿日時: 2003-09-26 08:20
>けむさま
どうもありがとうございます。早速やってみます。 なんやかんやで、やっぱり同じようなことで 悩んでいた方がいらっしゃるというのは、 救いになります・・・ また、報告いたします! |
|
投稿日時: 2003-09-26 10:13
// パース対象のxmlファイルがあるディレクトリをセットしておく
private String dir; ディレクトリの実際の中身は ・C:\test\test ・file://c:/test/test どちらでもいいのでしょうか? やはりパス内に日本語が入っていて かつ、 外部DTD参照の指定が相対パスの場合は無理でした。。。 |
|
投稿日時: 2003-09-26 10:41
ども、ほむらです。
実験しようと思ったんですがDLできなくて実験してません。。。。 人柱にするみたいで申し訳ないんですが。。。 もし、よかったらダメ元で試してみてください。 ----------- 1の方法を使用したソースファイルを文字コード UTF-8 で保存する。 日本語が使えないというところが変だなーと思ってみたり。。。 |
|
投稿日時: 2003-09-26 11:01
コンパイル時にソースの日本語部分が化けちゃいました。
エラー100件(^^) エラーメッセージ部分のほとんどを日本語表記という要望 ですので、山盛りの日本語があは行っております。 勝手ばかり申し訳ございません。 日本語は使えるんどエスが、日本語のファイル名をもちいたときに、 xml文書内のDTD参照が相対パスなら 対応できないのです・・・・ あぁ。。。なきそう |
