目次へ

6. DTD(DocumentType)

6.1. DTDを読み込む

DTD(Document Type Definition)は、日本語で文書型定義とよばれるもので、XMLのスキーマ言語のひとつです。DOMでは、DTDをDocumentTypeインタフェースで扱います。

まず、XML文書のDTDの内容を取得する方法を説明します。DocumentTypeノードはDocumentノードのgetDocType()メソッドを用いて取得します。DocumentTypeインタフェースには、以下のメソッドが用意されている。

メソッド 内容
public String getName() DTD の名前 (DOCTYPE キーワードの直後の名前)
public String getPublicId()
外部サブセットの公開識別子
getSystemId
public String getSystemId()
外部サブセットのシステム識別子

例えば、以下のようなweb.xmlがあります。

 1  <?xml version="1.0" encoding="ISO-8859-1"?>
 2
 3  <!DOCTYPE web-app
 4      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 5      "http://java.sun.com/dtd/web-app_2_3.dtd">
 6
 7  <web-app>
...

DTDの公開識別子、システム識別子を読み込むプログラムは以下のようになります。

 1  import java.io.*;
 2  import org.w3c.dom.Document;
 3  import org.w3c.dom.DocumentType;
 4  import javax.xml.parsers.*;
 5
 6  public class DocumentTypeSample{
 7      
 8      public static void main(String args[]) throws Exception{
 9
10          Document document= DocumentBuilderFactory
11              .newInstance()
12              .newDocumentBuilder()
13              .parse(new File("web.xml"));
14
15          DocumentType dtd=document.getDoctype();
16          System.out.println(dtd.getName());
17          System.out.println(dtd.getPublicId());
18          System.out.println(dtd.getSystemId());
19
20
21      }
22      
23  }

10-13行目でweb.xmlを読み込み、Documentノードを取得しています。15行目で、DoumentノードよりDocumentTypeノードを取得しています。16-18行目で、名前(ルート要素の名前)、公開識別子、システム識別子を取得し、表示しています。上のプログラムを実行すると、以下のような結果が得られます。

1  web-app
2 -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN
3 http://java.sun.com/dtd/web-app_2_3.dtd

(実習課題1)

XMLパーサには、DTDを解読した上でXML文書がDTDに沿った構造になっているか解析するvalidate機能が提供されています。ただし、アプリケーションで使用するXMLの構造があらかじめ決まっている場合、パーサがDTDを読み取る処理がオーバーヘッドになります。そこで、以下のコンソールプログラムを作成しなさい。

  • 引数に与えられたXML文書が、以下のDTDで表される構造になっているか、判定するプログラム
  • 与えられたXMLが以下の条件を満たすときのみ、DTDに沿ったXMLファイルかどうか、解析する。解析結果は標準出力に表示する。
    • ルート要素 :person
    • 公開識別子: -//Four Dimensional Data, Inc.//DTD DOM Example 1.0//EN
    • システム識別子: http://www.techscore.com/tech/Java/DOM/DOMExample.dtd
  • 上記以外のDTDが指定されている場合、エラーメッセージを標準エラーに出力し、プログラムを終了する。
  • XMLパーサのvalidate機能を使用しない。
     Java 1.4付属のパーサを使用する場合、デフォルトでXMLパーサのvalidate機能は使用できないようになっています。また、以下のようにして、validate機能を使用しないように設定することが可能です。
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(false);
    
  • 解析するXML文書にコメントやエンティティは含まれないものとしてよい。

  • DTDは以下の通り。
    <!-- person要素がルート要素となる -->
    <!ELEMENT person (name,age,license*)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT license (#PCDATA)>
    ※"http://www.techscore.com/tech/Java/DOM/DOMExample.dtd"が参照できる環境でプログラムを実行する必要があります。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ