6. DTD(DocumentType)
XML DOM XSLT 6章 DTD(DocumentType)
- 6.1. DTDを読み込む
- 6.2. DocumentTypeの生成
- 6.3. DTDを書く
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*)>
※"http://www.techscore.com/tech/Java/DOM/DOMExample.dtd"が参照できる環境でプログラムを実行する必要があります。
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT license (#PCDATA)>