最新閲覧日:

DTDを利用したXMLファイルを読み込むDOMパーサーを作ってます。

表題のとおり、DOMパーサーがXMLファイル、DTDファイルを読み込む際に
DTDファイルをローカルマシン(実行環境)のクラスパスにあるディレクトリ
から読み込みたいのですがうまくいきません。

XMLパーサーにxercesを利用し、DOMを使ってます。

例えば、

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pagecontrol SYSTEM "sample.dtd">
<PEOPLE>
<NAME>afternoon_cafe</NEME>
</PEOPLE>

のようなXMLファイルを、DOMパーサーがparse()メソッドによりロード
すると、"sample.dtd"をカレントディレクトリからしか検索しません。
この"sample.dtd"をクラスパスにあるディレクトリに置き、それを
読み込むようにしたいのですが、、、

どなたかわかる方がいれば、教えてください。
お願いします。

このQ&Aに関連する人気のQ&A

A 回答 (3件)

質問の内容を誤解していました。


かみあってませんでしたね。すみません。

>結局、DTDファイルは、クラスパスによる検索はできないということ
>なんでしょうか?

#2の回答で削除を申し出た「DTDをライブラリに追加する」の部分にあたりますが、
「実装する」=「クラスを生成する」方法ならありますけどね。
●Oracle XML Class Generator for Java
のように、DTDに基づいて各要素一種類ごとにクラスを生成するわけです。
下記URLの図2はわかりやすいですね。
http://www.atmarkit.co.jp/fxml/rensai/xdk01/xdk0 …

>例えば、XMLに<!DOCTYPE>宣言を記述せず、XMLパーサープログラム側で
>DTDの指定とかする方法はないのですかねぇ?

上記方法から考えてみて下さい。あると思います。
ただ、念のために書いておきますが
DTDの内容はELEMENT宣言とATTLIST宣言だけではないですよね?
ENTITY宣言もDTDの一部ですが、ファイル毎に異なる記述をするケースもあるのです。

<!DOCTYPE section SYSTEM "../program/section.dtd" [
<!--要素宣言と属性宣言は外部ファイル参照 ↑(変更は不可)-->
<!--記法名-->
<!NOTATION TIF SYSTEM "C:\Program Files\Adobe\Illustrator 8.0J\Illustrator.exe">
<!--実体宣言ここから(ファイル毎に記述)-->
<!ENTITY CJG70210 SYSTEM "C:\images\CJG70210.tif" NDATA TIF>
<!ENTITY CYH50260 SYSTEM "C:\images\CYH50260.tif" NDATA TIF>
<!ENTITY CYH50310 SYSTEM "C:\images\CYH50310.tif" NDATA TIF>
<!ENTITY CYH50390 SYSTEM "C:\images\CYH50390.tif" NDATA TIF>



<!--実体宣言ここまで-->
]>
<!--DOCTYPE宣言終わり-->

みたいなXML文書の場合もあるので「<!DOCTYPE>宣言を記述せず」がいいかどうかはわかりません。
もちろん、外部エンティテイの扱いも処理系に実装すればいいのですが。
ちなみに、今この外部エンティテイを使用禁止にすべく改造中です(苦笑)。

スキーマ言語はDTDだけではありませんし、
人によって(XMLに)求めるものも違いますので、このへんで。
    • good
    • 0
この回答へのお礼

詳しい解説、ありがとうございます。

おかげで、XMLに関する勉強ができました。

DTDの読み込みは、Oracle XML Class Generator for Javaで
再度、検討してみることにしてみます。

お礼日時:2001/10/09 10:10

>下記の回答の意味がよくわかりません


>●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい)
>具体的な例でお教え願えませんでしょうか?

説明がヘタですみません。
訂正と補足します。

×PUBLIC宣言して

○公開実体のキーワード「PUBLIC」を使用して、公開実体の内容を識別子
(例:-//Afternoon-cafe//DTD sample//EN)によって指定する

DTDをライブラリに追加する

(DTDへのパスを文書側に記述するのではなく)処理系側でDTDへのパスを定義する/実装する
……というつもりで書いたのですが、この部分は削除させて下さい。
考えてみたら必要ないですね(笑)。

それから、理解していただいているとは思いますが、
●絶対指定「または」
●PUBLIC

ですね。。。

---
■具体例
<!DOCTYPE pagecontrol
  PUBLIC "-//Afternoon-cafe//DTD sample//JA"
  "http://www.xxx.co.jp/j2ee/dtds/sample.dtd">

■説明
文書型宣言の内容は御存じだとは思いますが、
<!DOCTYPE(文書型宣言キーワード)
pagecontrol(文書型定義名)
SYSTEM(文書型定義キーワード)
"sample.dtd"(文書型定義内容:この場合は外部ファイル)>
を指しています。

これを
<!DOCTYPE pagecontrol
PUBLIC(公開実体キーワード)
"-(登録識別(+ | -))//
Afternoon-cafe(所有者)//
DTD(クラスキーワード)
sample(説明)//
JA(言語コード:この場合は日本語)"
"http://www.hoge.co.jp/j2ee/dtds/sample.dtd"(URI)>
とする方法もあります、ということです。

#本来、キーワード「PUBLIC」は公開された(業界標準規格などの)文書型定義(例:HTMLのDTDなど)を指します。
---
#このケースで紹介するのはマズかったですね(反省)。

この回答への補足

なるほど、、、いろいろ知らない事ばっかりでした。
勉強になります。

結局、DTDファイルは、クラスパスによる検索はできないということ
なんでしょうか?

例えば、XMLに<!DOCTYPE>宣言を記述せず、XMLパーサープログラム側で
DTDの指定とかする方法はないのですかねぇ?

補足日時:2001/10/05 09:42
    • good
    • 0

「ローカル環境(単独)でxercesを利用」という解釈でお答えします。



>"sample.dtd"をカレントディレクトリからしか検索しません

<!DOCTYPE pagecontrol SYSTEM "sample.dtd">
はカレントディレクトリを指していますので……。

私の場合は作業ディレクトリから(理由があって)相対指定で
<!DOCTYPE pagecontrol SYSTEM "../program/sample.dtd">
のようにしています。

このケースでしたら
●クラスパスにあるディレクトリを絶対指定する
●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい)
のがいいのではないかと思います。

#この辺はSGML本に書いてありますので読んでみて下さい。

この回答への補足

さっそくの回答ありがとうございます。

私の勉強不足で申し訳ないのですが、下記の回答の意味がよくわかりません。。。

●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい)
のがいいのではないかと思います。

具体的な例でお教え願えませんでしょうか?

補足日時:2001/10/04 09:58
    • good
    • 0

このQ&Aに関連する最新のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ