• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DTDファイルをクラスパスから読み込みたい)

DTDファイルをクラスパスから読み込む方法とは?

このQ&Aのポイント
  • DTDファイルをクラスパスから読み込む方法を知りたい。
  • XMLファイルとDTDファイルを使ったDOMパーサーの作成について、クラスパスからDTDファイルを読み込む方法がわかりません。
  • XMLファイルのDOMパーサーで、DTDファイルを実行環境のクラスパスから読み込む方法を教えてください。

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

  • ベストアンサー
  • fatback
  • ベストアンサー率84% (11/13)
回答No.3

質問の内容を誤解していました。 かみあってませんでしたね。すみません。 >結局、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
質問者

お礼

詳しい解説、ありがとうございます。 おかげで、XMLに関する勉強ができました。 DTDの読み込みは、Oracle XML Class Generator for Javaで 再度、検討してみることにしてみます。

その他の回答 (2)

  • fatback
  • ベストアンサー率84% (11/13)
回答No.2

>下記の回答の意味がよくわかりません >●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
質問者

補足

なるほど、、、いろいろ知らない事ばっかりでした。 勉強になります。 結局、DTDファイルは、クラスパスによる検索はできないということ なんでしょうか? 例えば、XMLに<!DOCTYPE>宣言を記述せず、XMLパーサープログラム側で DTDの指定とかする方法はないのですかねぇ?

  • fatback
  • ベストアンサー率84% (11/13)
回答No.1

「ローカル環境(単独)でxercesを利用」という解釈でお答えします。 >"sample.dtd"をカレントディレクトリからしか検索しません <!DOCTYPE pagecontrol SYSTEM "sample.dtd"> はカレントディレクトリを指していますので……。 私の場合は作業ディレクトリから(理由があって)相対指定で <!DOCTYPE pagecontrol SYSTEM "../program/sample.dtd"> のようにしています。 このケースでしたら ●クラスパスにあるディレクトリを絶対指定する ●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい) のがいいのではないかと思います。 #この辺はSGML本に書いてありますので読んでみて下さい。

afternoon_cafe
質問者

補足

さっそくの回答ありがとうございます。 私の勉強不足で申し訳ないのですが、下記の回答の意味がよくわかりません。。。 ●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい) のがいいのではないかと思います。 具体的な例でお教え願えませんでしょうか?