- PR -

parse(絶対パス)とparse(new InputSource(new FileInputStream(絶対パス)))の長短

投稿者投稿内容
やべっち
会議室デビュー日: 2003/07/06
投稿数: 17
投稿日時: 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/07/06
投稿数: 17
投稿日時: 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/07/06
投稿数: 17
投稿日時: 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
投稿数: 40
投稿日時: 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/07/06
投稿数: 17
投稿日時: 2003-09-26 08:20
>けむさま

どうもありがとうございます。早速やってみます。

なんやかんやで、やっぱり同じようなことで
悩んでいた方がいらっしゃるというのは、
救いになります・・・ また、報告いたします!
やべっち
会議室デビュー日: 2003/07/06
投稿数: 17
投稿日時: 2003-09-26 10:13
// パース対象のxmlファイルがあるディレクトリをセットしておく
private String dir;


ディレクトリの実際の中身は
・C:\test\test
・file://c:/test/test
どちらでもいいのでしょうか?

やはりパス内に日本語が入っていて かつ、
外部DTD参照の指定が相対パスの場合は無理でした。。。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-09-26 10:41
ども、ほむらです。
実験しようと思ったんですがDLできなくて実験してません。。。。
人柱にするみたいで申し訳ないんですが。。。
もし、よかったらダメ元で試してみてください。
-----------
1の方法を使用したソースファイルを文字コード UTF-8 で保存する。

日本語が使えないというところが変だなーと思ってみたり。。。
やべっち
会議室デビュー日: 2003/07/06
投稿数: 17
投稿日時: 2003-09-26 11:01
コンパイル時にソースの日本語部分が化けちゃいました。
エラー100件(^^)

エラーメッセージ部分のほとんどを日本語表記という要望
ですので、山盛りの日本語があは行っております。


勝手ばかり申し訳ございません。
日本語は使えるんどエスが、日本語のファイル名をもちいたときに、
xml文書内のDTD参照が相対パスなら 対応できないのです・・・・

あぁ。。。なきそう

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