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"をクラスパスにあるディレクトリに置き、それを
読み込むようにしたいのですが、、、
どなたかわかる方がいれば、教えてください。
お願いします。
No.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に)求めるものも違いますので、このへんで。
詳しい解説、ありがとうございます。
おかげで、XMLに関する勉強ができました。
DTDの読み込みは、Oracle XML Class Generator for Javaで
再度、検討してみることにしてみます。
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など)を指します。
---
#このケースで紹介するのはマズかったですね(反省)。
この回答への補足
なるほど、、、いろいろ知らない事ばっかりでした。
勉強になります。
結局、DTDファイルは、クラスパスによる検索はできないということ
なんでしょうか?
例えば、XMLに<!DOCTYPE>宣言を記述せず、XMLパーサープログラム側で
DTDの指定とかする方法はないのですかねぇ?
No.1
- 回答日時:
「ローカル環境(単独)でxercesを利用」という解釈でお答えします。
>"sample.dtd"をカレントディレクトリからしか検索しません
<!DOCTYPE pagecontrol SYSTEM "sample.dtd">
はカレントディレクトリを指していますので……。
私の場合は作業ディレクトリから(理由があって)相対指定で
<!DOCTYPE pagecontrol SYSTEM "../program/sample.dtd">
のようにしています。
このケースでしたら
●クラスパスにあるディレクトリを絶対指定する
●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい)
のがいいのではないかと思います。
#この辺はSGML本に書いてありますので読んでみて下さい。
この回答への補足
さっそくの回答ありがとうございます。
私の勉強不足で申し訳ないのですが、下記の回答の意味がよくわかりません。。。
●PUBLIC宣言してDTDをライブラリに追加する(HTMLのDTDを参考にして下さい)
のがいいのではないかと思います。
具体的な例でお教え願えませんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- WordPress(ワードプレス) ワードプレスにて .xmlファイルの使い方をご存知の方、よろしくお願いいたします。 2 2022/09/30 00:55
- CGI CGIが読み書きするデータファイルのパーミッションはさくらのインターネットでは何にするべき? 1 2023/05/02 16:44
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- ASP・SaaS FC2 BLOG <AUDIO TAGを入れプレビューはOk テーンプレートを更新すると ✖ 1 2023/08/14 11:40
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- 電子書籍 電子書籍の開き方教えて 2 2022/04/30 07:04
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
u_shortなどの省略した宣言につ...
-
東芝のDynabookなのですがアン...
-
SNMP リンクダウンとノードダ...
-
XMLで特殊文字を扱うにはどうし...
-
XSLで、XMLの空タグを制御したい。
-
xmlファイルが上手にHTMLに変換...
-
UTF-8でエンコーディングとはど...
-
XMLで要素が記述された順番に意...
-
XML、XSLTの適応エラー(IEから...
-
コンテキストメニュークリック...
-
特殊記号が勝手にエスケープさ...
-
ルート要素ノードが2個ある場合?
-
ToolStripMenuItemの選択(VB)
-
VB.NETで最後フォのフォ...
-
XMLをXSLを使いHTMLに変換した...
-
Visual Basic .NET の識別子は...
-
CPUの考え方を教えてください ...
-
XMLの要素の内容の中に要素
-
<xsl:key>とtopreceding-siblin...
-
ノード数とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBでXMLファイルを作ると xmlns...
-
このエラー、何とかなりません...
-
競技プログラミングに関する質...
-
DTDファイルをクラスパスから読...
-
Delphiでプログラムを分割するとき
-
縁切りするとき
-
XML Schemaの妥当性のチェック
-
XMLをDTDで検証しようとしたら...
-
<?xml version="1.0" encording...
-
u_shortなどの省略した宣言につ...
-
XMLで改行
-
東芝のDynabookなのですがアン...
-
CPUの考え方を教えてください ...
-
バッチファイルでテキストファ...
-
XML、XSLTの適応エラー(IEから...
-
XMLで要素が記述された順番に意...
-
XML同じ名前の要素を自動で集約...
-
xmlファイルが上手にHTMLに変換...
-
UTF-8でエンコーディングとはど...
-
excelにてweb関数を使い、webデ...
おすすめ情報