OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

DTDファイルをクラスパスから読み込みたい

  • すぐに回答を!
  • 質問No.145186
  • 閲覧数889
  • ありがとう数13
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 61% (8/13)

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"をクラスパスにあるディレクトリに置き、それを
読み込むようにしたいのですが、、、

どなたかわかる方がいれば、教えてください。
お願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル7

ベストアンサー率 84% (11/13)

質問の内容を誤解していました。
かみあってませんでしたね。すみません。

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

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

>例えば、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に)求めるものも違いますので、このへんで。
お礼コメント
afternoon_cafe

お礼率 61% (8/13)

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

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

DTDの読み込みは、Oracle XML Class Generator for Javaで
再度、検討してみることにしてみます。
投稿日時 - 2001-10-09 10:10:15
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル7

ベストアンサー率 84% (11/13)

「ローカル環境(単独)でxercesを利用」という解釈でお答えします。 >"sample.dtd"をカレントディレクトリからしか検索しません <!DOCTYPE pagecontrol SYSTEM "sample.dtd"> はカレントディレクトリを指していますので……。 私の場合は作業ディレクトリから(理由があって)相対指 ...続きを読む
「ローカル環境(単独)でxercesを利用」という解釈でお答えします。

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

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

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

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

#この辺はSGML本に書いてありますので読んでみて下さい。
補足コメント
afternoon_cafe

お礼率 61% (8/13)

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

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

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

具体的な例でお教え願えませんでしょうか?
投稿日時 - 2001-10-04 09:58:56
  • 回答No.2
レベル7

ベストアンサー率 84% (11/13)

>下記の回答の意味がよくわかりません >●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい) >具体的な例でお教え願えませんでしょうか? 説明がヘタですみません。 訂正と補足します。 ×PUBLIC宣言して ↓ ○公開実体のキーワード「PUBLIC」を使用して、公開実体の内容を識別子 (例:-//Afternoon-cafe// ...続きを読む
>下記の回答の意味がよくわかりません
>●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など)を指します。
---
#このケースで紹介するのはマズかったですね(反省)。
補足コメント
afternoon_cafe

お礼率 61% (8/13)

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

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

例えば、XMLに<!DOCTYPE>宣言を記述せず、XMLパーサープログラム側で
DTDの指定とかする方法はないのですかねぇ?
投稿日時 - 2001-10-05 09:42:30
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ