目次へ

6.3. DTDを書く

それでは、DTDを出力するにはどうしたらよいのでしょう。今までDOMツリーをファイルに出力するために、Transformを使用してきました。しかし、TransformはDocumentTypeの内容を出力しません。

JAXP でDTDを出力するためには、TransformerのsetOutputPropertiesメソッドを使用します。

例えば、以下のように、strutsの定義ファイルであることを示すDTDを、XML文書に出力することを考えます。

 1  <?xml version="1.0" encoding="ISO-8859-1" ?>
 2  <!DOCTYPE struts-config PUBLIC
 3    "-//Apache SoftWare Foundation//DTD Struts Configuration 1.1//EN"
 4    "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
 5  <struts-config>
...

以上のXML文書を出力するプログラムは以下のようになります。

...
17      
18      public static void main(String args[]) throws Exception{
19          
...
27  
28          Document document = domImpl.createDocument("","struts-config",documentType);
29  
30  
31          TransformerFactory transformerFactory = TransformerFactory.newInstance();
32          Transformer transformer = transformerFactory.newTransformer();
33          transformer.setOutputProperty(OutputKeys.INDENT, "yes");
34          transformer.setOutputProperty(OutputKeys.METHOD, "xml");
35          transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd");
36          transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "-//Apache SoftWare Foundation//DTD Struts Configuration 1.1//EN");
37  
38  
39          DOMSource source = new DOMSource(document);
40          File newXML = new File("struts-config.xml"); 
41          FileOutputStream os = new FileOutputStream(newXML); 
42          StreamResult result = new StreamResult(os); 
43          transformer.transform(source, result);
44  
...

出力するDTDの内容は、TransformerのsetOutputPropertyメソッドで指定します。setOutputPropertyは一つ目の引数にプロパティ名、二つ目の引数にプロパティの値を指定します。指定できるプロパティ名は、OutputKeysのstaticフィールドで定義されています。以下に指定可能なプロパティを簡単に紹介します。

プロパティ 内容
ENCODING encoding は、Transformer が文字のシーケンスをバイトのシーケンスとして符号化するために使用する優先文字エンコーディングを指定します
DOCTYPE_PUBLIC

文書型定義で使用される公開識別子を指定します。

DOCTYPE_SYSTEM

文書型定義で使用されるシステム識別子を指定します。

INDENT このキーに対する値は "yes" または "no" です。
indent は、結果ツリーを出力する際に Transformer がさらに空白を追加するかどうかを指定します。値は、yes または no でなければなりません。

35行目でシステム識別子、36行目に公開識別子を取得します。Propertyを指定したら、ファイルに出力します。struts-config.xmlには以下のように出力されます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache SoftWare Foundation//DTD Struts Configuration 1.1//EN" 
            "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config/>

(実習課題2)

以下のXML文書を出力するプログラムを作成しなさい

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person PUBLIC "-//Four Dimensional Data, Inc.//DTD DOM Example 1.0//EN"
        "DOMExample.dtd">
<person>
<name>Taro Yamada</name>
<age>31</age>
<license>Sun Certified Programmer</license>
<license>Sun Certified Developer</license>
</person>

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp