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

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

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

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"をクラスパスにあるディレクトリに置き、それを 読み込むようにしたいのですが、、、 どなたかわかる方がいれば、教えてください。 お願いします。

  • XML
  • 回答数3
  • ありがとう数13

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

  • ベストアンサー
  • 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を参考にして下さい) のがいいのではないかと思います。 具体的な例でお教え願えませんでしょうか?

関連するQ&A

  • SAXでparseを行う際の、DTDとの妥当性チェックついて

    Java&XMLの初心者です。 用語の使い方など間違っているかもしれませんが、 よろしくお願いします。 XMLパーサーにxercesを利用しています。 以下のようなXMLをがあったときに、 <?xml version="1.0"?> <!DOCTYPE a SYSTEM "a.dtd"> <a> <b>1</b> <b>1</b> </a> 以下のコードを実行すると、  SAXParserFactory f = SAXParserFactory.newInstance();  f.setValidating(true);  SAXParser p = f.newSAXParser();  p.parse((InputSource)xml, handler); カレントディレクトリにあるa.dtdとの妥当性をチェックしますが、 これをファイルは無視し、指定した文字列とチェックをさせるなどと いうことは可能でしょうか?

    • ベストアンサー
    • XML
  • XMLEDITOR.NETでDTDを有効にするには

    XMLEDITOR.NETツールで、行数が多いXMLを読み込んでから、 [ツール(T)] - [妥当性検証(外部ファイル)(F)]をクリックし、 外部サブセット(別ファイル)のDTDファイルを選択したところ、 以下のエラーメッセージが表示されます。  ↓ 「セキュリティ上の理由から、DTDはこのXMLドキュメントでは使用  できません。DTD処理を有効にするには、XmlReaderSettingsの  ProhibitDtdプロパティをFalseに設定し、XmlReader.Createメソ  ッドにその設定を渡してください。」 ネットでいろいろ調べたところ、 マイクロソフトのSystem.xml.dllモジュール内のようなのですが、 有料のマイクロソフトツール等、私は持っていない為、 そのDLL内を編集することが出来ない状況です。 やはり、有料のマイクロソフトツールを購入して利用しないと、 このエラーは解消出来ないのでしょうか? PS: 私が実施したいことは、単に、 外部DTDファイルとXMLファイルとの間における 「妥当な文書(valid XML document)」を、 チェックしたいだけなので、 もし、 上記エラーが解消出来ないようでしたら、 他に良いバリデータ(検証ツール)があれば、 そちらを教えていただけましたら幸いです。 ちなみにネットで調べて、「MSV(Oracle Multi-Schema XML Validator)」を 試してみましたが、実行すると、 以下のエラーメッセージが表示されて、  ↓ Exception in thread "main" java.net.MalformedURLException: no protocol: xmlCheck /test20120508.dtd/test20120508.xml at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at java.net.URL.<init>(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.startDocumentEntity(Unknown Source) at org.apache.xerces.impl.XMLDocumentScannerImpl.setInputSource(Unknown Source) at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at com.sun.msv.reader.util.GrammarLoader._loadSchema(GrammarLoader.java:513) at com.sun.msv.reader.util.GrammarLoader.parse(GrammarLoader.java:331) at com.sun.msv.driver.textui.Driver.run(Driver.java:217) at com.sun.msv.driver.textui.Driver.main(Driver.java:68) こちらも今のところ利用出来ていない状況です。 以上になります。 よろしくお願いします。

    • ベストアンサー
    • XML
  • DTDと名前空間

    DTDと名前空間の関係について質問します。 XMLの本を読みDTDと名前空間の大まかなイメージを下記のようにつかみました。 DTD: XML文書の妥当性を規定し、DTD宣言で指定。 名前空間: ひとつのXML内で要素名の衝突を避けるために、xmlnsで指定。 XHTMLのDTD宣言 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> XHTMLの名前空間(http://www.w3.org/1999/xhtml) <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> XHTML文書の場合、DTDと名前空間がそれぞれひとつです。 しかし、ひとつのXMLドキュメントで複数の名前空間を利用する場合は、それぞれの名前空間に対して、DTDを宣言するのでしょうか。つまり複数のDTD宣言があるXMLドキュメントになるのでしょうか。 DTDと名前空間の関係が良く分かりません。 XML自体を勉強し始めたばかりで、まとまりのない質問で申し訳ありませんが、よろしくお願いします。

    • ベストアンサー
    • XML
  • log4j.xmlファイルの読込で。。。

    log4Jの設定ファイルの読込を DOMConfigurator.configure("log4j.xml"); とJavaで記述していますが以下のエラーが表示されます。 log4j:ERROR Could not parse file [log4j.xml]. java.io.FileNotFoundException: C:\WINDOWS\System32\log4j.xml (指定されたファイルが見つかりません。) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source) at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source) atorg.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) at org.apache.log4j.xml.DOMConfigurator$1.parse(DOMConfigurator.java:598) at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:711) at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:604) at org.apache.log4j.xml.DOMConfigurator.configure(DOMConfigurator.java:733) at HttpTestServlet.doPost(HttpTestServlet.java:31) どこに原因があるのかわかりませんので、 どなたかわかる方がいらっしゃいましたらご指摘願います。

  • XML(DTD)の<!ENTITYを読み込むには?

    Perlで、XMLのDTD内の、 たとえば以下のような   ↓ <!ENTITY rt4 "ルーチン4"> (キー”rt4”と、値”ルーチン4”)を、 読み込むには、どうすればよいのでしょうか? 単純にXML(DTD)をテキストファイルとしてオープンして、 正規表現などで読み込むのではなく、 この<!ENTITY~ タグを利用して、 簡単に読み込める方法があるのでは? と思い、ネット上を探しておりましたが、 具体的な方法が見つけられなかった為、 ご質問させていただきました。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • JavaでXMLをファイルからじゃなく扱いたい

    Javaで例えば、String変数に String str = "<xml sample>hogehoge</xml sample>" みたいにXML形式のデータが入っているとして、このデータを、XMLファイルをDOMで扱う時のように扱えないでしょうか?一度、ファイルに書きだして、XMLファイルとして読み込ませないと難しいでしょうか?

    • ベストアンサー
    • Java
  • XMLパーサの種類について混乱してます

    XSLTをいじる必要に駆られて、現在Java1.4+JAXP1.1を利用しています。 いままで、javax.xml.transformをimportしてメソッドを実行するだけで、「変換系に何を使っているのか」については全く気にしていなかったのですが、その実体は何なのでしょうか? (XTとかXalanとか、単体の変換系がありますよね・・・?) また、DOMパーサ、SAXパーサもJAXPで使えますが、各々のパーサや変換系を集めてパッケージにしたものがJAXPなんでしょうか。 さらに、勉強中にXMLパーサという単語が出てきて混乱しています。XMLパーサは、DOM・SAX・XSLT等とは違うのでしょうか? (XMLパーサと名乗っているXercesは何に使うのでしょうか・・・) DTDとの関連も含めて解説して頂けたら嬉しいです。

    • ベストアンサー
    • Java
  • Java ファイルオブジェクトでなく文字列オブジェクト?

    JavaでXMLをパースするプログラムを初めて試しています。 parseメソッドの第一引数がファイルオブジェクトなのですが、これをメモリ(文字列)オブジェクトを与えて同じ動作させるものはあるのでしょうか? // SAXパーサーファクトリを生成 SAXParserFactory spfactory = SAXParserFactory.newInstance(); // SAXパーサーを生成 SAXParser parser = spfactory.newSAXParser(); // XMLファイルを指定されたデフォルトハンドラーで処理します parser.parse(new File("helloworld.xml"), new InsXMLParser()); ※このように String str = "<xml? ......"; parser.XXXXXX(str, new InsXMLParser

    • ベストアンサー
    • XML
  • DOMでパースしているXML全体の出力方法

    お世話になります。 JavaでDOMを使ってXML操作をしたいと考えております。 おおよそ、以下のソースでparseできるところまで確認できました。 DOMParser parser = new DOMParser(); parser.parse("XMLファイルパス"); Document doc = parser.getDocument(); 開発中なので、DOM操作した結果のXMLを随時コンソールやログに 出力させたいのですが、たとえばdoc.toString()してもnullとなり、 正常に出力されません。 以下のようにElementを取得すると正常にアクセスできていることは 確認しています。 Element rootEl = doc.getDocumentElement(); System.out.println(rootEl.getNodeName()); なお、DOMライブラリにはxercesを用いております。 Dom4jのAPIも見てみましたが、それらしいメソッドを見つけることが できていません。 簡単にXMLを出力できることが理想です。 一般的な方法、よくやる手法など、みなさんよりご教示頂きたいです。

    • ベストアンサー
    • Java
  • xmlファイルが生成されない

    <?php //DomDocumentを呼び出す $dom = new DomDocument('1.0','UTF-8'); //要素ノード[document]を追加 $document = $dom->appendChild($dom->createElement('document')); //新しい要素をdocumentの子要素として挿入する $document->appendChild($dom->createElement('name','名前です')); $document->appendChild($dom->createElement('text','テキストです。')); //字下げや空白を考慮してきれいに整形した出力を行う $dom->formatOutput = true; //同階層にtest.xmlとして保存 $dom->save('test.xml'); //出力 echo $dom->saveXML(); ?> のように、同じディレクトリ内にXMLファイルを生成するphpプログラムを作成してみたのですが、 ブラウザからこのPHPファイルにアクセスしてもXMLファイルが作られません。どうすれば良いのでしょうか。 なにかphp,apache等の設定をしてないからでしょうか。 よろしくお願いします。

    • 締切済み
    • PHP