JavaA2Z

KAB-studio > プログラミング > JavaA2Z > DTDとは

DTD

日本語 文書型定義
英語 Document Type Definition
ふりがな でぃーてぃーでぃー
フリガナ ディーティーディー

解説

XMLスキーマ言語のひとつ。
 
XMLの構造をチェックするためのファイルXMLスキーマ)の言語仕様のひとつ。
<!ELEMENT 構造>」というタグを用いて、XMLの構造を指定する。
たとえば、以下のように記述する。
 
<!ELEMENT test_xml (test1,test2)>
<!ELEMENT test1 (#PCDATA)>
<!ELEMENT test2 (test2_child)>
<!ELEMENT test2_child (#PCDATA)>
 
「構造」の箇所は、「タグA (タグB)」となっていれば、「タグA内にタグBが入る」、つまり「<タグA><タグB></タグB></タグA>」という構造となることを示す。
また、「タグA (#PCDATA)」となっていれば、「タグA内に文字列が入る」、つまり「<タグA>文字列</タグA>」という構造となることを示す。
このようにして、XMLタグの構造を指定する。
このDTDは通常ファイルとして保存し、拡張子を「.dtd」とする。このファイルをローカルファイルとして置くか、インターネット上で公開する。
 
XMLでは、<!DOCTYPE>タグでDTDを指定する。
たとえば、上記DTDファイルをD:/sample.dtdに置いた場合、XMLでは以下のように記述する。
 
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE test_xml SYSTEM "file:///D:/sample.dtd">
<test_xml>
<test1>テストです</test1>
<test2>
<test2_child>テストですって</test2_child>
</test2>
</test_xml>
 
<!DOCTYPE ルートタグ SYSTEM "file:///ファイルパス">」という形式でDTDファイルを指定する。
このXMLがDTDに適合していない場合にはエラーとなる。
 
また、インターネット上に公開されたDTDを参照する場合、XMLに次のように記述する。

<?xml version="1.0" encoding="Windows-31J"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<!-- webapps/sample-servlet/WEB-INF/web.xml -->
<web-app>
</web-app>
 
<!DOCTYPE ルートタグ PUBLIC "DTD名" "URL">」という形式でDTDを指定する。
web.xmlの構造を定義したDTDはhttp://java.sun.com/dtd/web-app_2_3.dtdに置かれており、これを参照したものである。
 
Javaでは、DocumentBuilderFactoryインターフェイスのsetValidating()メソッドtrueを渡すことで、DTDによるチェックをう。
ただし、エラー等が発生していたとしても例外投げられるわけではなく、標準エラー出力エラー内容が出力されるだけである。エラーに対処する場合には、org.xml.sax.ErrorHandlerインターフェイス実装クラスを作り、オーバーライドしたメソッドエラー処理をうようにし、これをDocumentBuilderインターフェイスのsetErrorHandler()メソッドに渡してセットする必要がある。
 
XMLスキーマ言語には様々な種類があるが、現在最も広く使用されているのはDTDである。
そのため、DTDを知っておけばXMLスキーマについてはほぼ問題ないと思われる。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

<!-- D:/sample.dtd -->
<!-- UTF-8で保存してください。 -->
<!ELEMENT test_xml (test1,test2)>   <!-- test_xmlタグ内にtest1タグとtest2タグがある、という意味です。 -->
<!ELEMENT test1 (#PCDATA)>          <!-- test1タグ内に文字列がある、という意味です。 -->
<!ELEMENT test2 (test2_child)>      <!-- test2タグ内にtest2_childタグがある、という意味です。 -->
<!ELEMENT test2_child (#PCDATA)>    <!-- test2_childタグ内に文字列がある、という意味です。 -->


// Sample.java
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Sample
{
    public static void main( String[] args )
    {
        // 例1:XMLがDTD通りの場合(DTDをXML内に記述)
        ByteArrayInputStream byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            final String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りのXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE test_xml ["
                + "    <!ELEMENT test_xml (test1,test2)>"
                + "    <!ELEMENT test1 (#PCDATA)>"
                + "    <!ELEMENT test2 (test2_child)>"
                + "    <!ELEMENT test2_child (#PCDATA)>"
                + "]>"
                + "<test_xml>\n"
                + "    <test1>テストです</test1>\n"
                + "    <test2>\n"
                + "        <test2_child>テストですって</test2_child>\n"
                + "    </test2>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            System.out.println( "1:パーシング完了。" );
            // 1:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例2:XMLがDTD通りではない場合(DTDをXML内に記述)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            final String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りのXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE test_xml ["
                + "    <!ELEMENT test_xml (test1,test2)>"
                + "    <!ELEMENT test1 (#PCDATA)>"
                + "    <!ELEMENT test2 (test2_child)>"
                + "    <!ELEMENT test2_child (#PCDATA)>"
                + "]>"
                + "<test_xml>\n"
                + "    <test>テストです</test>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            // Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
            // set, which is probably not what is desired.  Parser will use a default
            // ErrorHandler to print the first 10 errors.  Please call
            // the 'setErrorHandler' method to fix this.
            // Error: URI=null Line=3: 要素 "test_xml" ではここに "test" を指定することを許可されません。
            // Error: URI=null Line=3: 要素タイプ "test" は宣言されていません。
            // Error: URI=null Line=4: 要素 "test_xml" には追加属性が必要です。

            // このように、XMLがDTDと一致しないため、エラーとなります。
            // ただし、これは「標準エラー出力」に出力されるだけですので、
            // 実際にエラー処理をする場合には、org.xml.sax.ErrorHandlerインターフェイスの
            // 実装クラスを、DocumentBuilderインターフェイスのsetErrorHandler()メソッドに
            // 渡して、ErrorHandlerインターフェイスの実装クラスでエラー処理をする必要が
            // あります。

            System.out.println( "2:パーシング完了。" );
            // 2:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例3:XMLがDTD通りの場合(DTDローカルファイル)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            final String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りのXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE test_xml SYSTEM \"file:///D:/sample.dtd\">\n"
                + "<test_xml>\n"
                + "    <test1>テストです</test1>\n"
                + "    <test2>\n"
                + "        <test2_child>テストですって</test2_child>\n"
                + "    </test2>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            System.out.println( "3:パーシング完了。" );
            // 3:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例4:XMLがDTD通りではない場合(DTDローカルファイル)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りではないXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE SAMPLE_DTD SYSTEM \"file:///D:/sample.dtd\">\n"
                + "<test_xml>\n"
                + "    <test>テストです</test>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            // Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
            // set, which is probably not what is desired.  Parser will use a default
            // ErrorHandler to print the first 10 errors.  Please call
            // the 'setErrorHandler' method to fix this.
            // Error: URI=null Line=3: ルート要素タイプは "test_xml" ですが、"SAMPLE_DTD" と宣言されました。
            // Error: URI=null Line=4: 要素 "test_xml" ではここに "test" を指定することを許可されません。
            // Error: URI=null Line=4: 要素タイプ "test" は宣言されていません。
            // Error: URI=null Line=5: 要素 "test_xml" には追加属性が必要です。

            // このように、XMLがDTDと一致しないため、エラーとなります。
            // ただし、これは「標準エラー出力」に出力されるだけですので、
            // 実際にエラー処理をする場合には、org.xml.sax.ErrorHandlerインターフェイスの
            // 実装クラスを、DocumentBuilderインターフェイスのsetErrorHandler()メソッドに
            // 渡して、ErrorHandlerインターフェイスの実装クラスでエラー処理をする必要が
            // あります。

            System.out.println( "4:パーシング完了。" );
            // 4:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例5:XMLがDTD通りの場合(DTDパブリック)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りではないXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE \n"
                + "    web-app PUBLIC \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\n"
                + "    \"http://java.sun.com/dtd/web-app_2_3.dtd\">\n"
                + "<web-app>\n"
                + "    <servlet>\n"
                + "        <servlet-name>サーブレット名</servlet-name>\n"
                + "        <servlet-class>a.class</servlet-class>\n"
                + "    </servlet>\n"
                + "</web-app>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            System.out.println( "5:パーシング完了。" );
            // 5:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}
<!-- D:/sample.dtd -->
<!-- UTF-8で保存してください。 -->
<!ELEMENT test_xml (test1,test2)>   <!-- test_xmlタグ内にtest1タグとtest2タグがある、という意味です。 -->
<!ELEMENT test1 (#PCDATA)>          <!-- test1タグ内に文字列がある、という意味です。 -->
<!ELEMENT test2 (test2_child)>      <!-- test2タグ内にtest2_childタグがある、という意味です。 -->
<!ELEMENT test2_child (#PCDATA)>    <!-- test2_childタグ内に文字列がある、という意味です。 -->


// Sample.java
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

public class Sample
{
    public static void main( String[] args )
    {
        // 例1:XMLがDTD通りの場合(DTDをXML内に記述)
        ByteArrayInputStream byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            final String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りのXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE test_xml ["
                + "    <!ELEMENT test_xml (test1,test2)>"
                + "    <!ELEMENT test1 (#PCDATA)>"
                + "    <!ELEMENT test2 (test2_child)>"
                + "    <!ELEMENT test2_child (#PCDATA)>"
                + "]>"
                + "<test_xml>\n"
                + "    <test1>テストです</test1>\n"
                + "    <test2>\n"
                + "        <test2_child>テストですって</test2_child>\n"
                + "    </test2>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            System.out.println( "1:パーシング完了。" );
            // 1:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例2:XMLがDTD通りではない場合(DTDをXML内に記述)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            final String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りのXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE test_xml ["
                + "    <!ELEMENT test_xml (test1,test2)>"
                + "    <!ELEMENT test1 (#PCDATA)>"
                + "    <!ELEMENT test2 (test2_child)>"
                + "    <!ELEMENT test2_child (#PCDATA)>"
                + "]>"
                + "<test_xml>\n"
                + "    <test>テストです</test>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            // Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
            // set, which is probably not what is desired.  Parser will use a default
            // ErrorHandler to print the first 10 errors.  Please call
            // the 'setErrorHandler' method to fix this.
            // Error: URI=null Line=3: 要素 "test_xml" ではここに "test" を指定することを許可されません。
            // Error: URI=null Line=3: 要素タイプ "test" は宣言されていません。
            // Error: URI=null Line=4: 要素 "test_xml" には追加属性が必要です。

            // このように、XMLがDTDと一致しないため、エラーとなります。
            // ただし、これは「標準エラー出力」に出力されるだけですので、
            // 実際にエラー処理をする場合には、org.xml.sax.ErrorHandlerインターフェイスの
            // 実装クラスを、DocumentBuilderインターフェイスのsetErrorHandler()メソッドに
            // 渡して、ErrorHandlerインターフェイスの実装クラスでエラー処理をする必要が
            // あります。

            System.out.println( "2:パーシング完了。" );
            // 2:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例3:XMLがDTD通りの場合(DTDローカルファイル)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            final String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りのXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE test_xml SYSTEM \"file:///D:/sample.dtd\">\n"
                + "<test_xml>\n"
                + "    <test1>テストです</test1>\n"
                + "    <test2>\n"
                + "        <test2_child>テストですって</test2_child>\n"
                + "    </test2>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            System.out.println( "3:パーシング完了。" );
            // 3:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例4:XMLがDTD通りではない場合(DTDローカルファイル)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りではないXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE SAMPLE_DTD SYSTEM \"file:///D:/sample.dtd\">\n"
                + "<test_xml>\n"
                + "    <test>テストです</test>\n"
                + "</test_xml>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            // Warning: validation was turned on but an org.xml.sax.ErrorHandler was not
            // set, which is probably not what is desired.  Parser will use a default
            // ErrorHandler to print the first 10 errors.  Please call
            // the 'setErrorHandler' method to fix this.
            // Error: URI=null Line=3: ルート要素タイプは "test_xml" ですが、"SAMPLE_DTD" と宣言されました。
            // Error: URI=null Line=4: 要素 "test_xml" ではここに "test" を指定することを許可されません。
            // Error: URI=null Line=4: 要素タイプ "test" は宣言されていません。
            // Error: URI=null Line=5: 要素 "test_xml" には追加属性が必要です。

            // このように、XMLがDTDと一致しないため、エラーとなります。
            // ただし、これは「標準エラー出力」に出力されるだけですので、
            // 実際にエラー処理をする場合には、org.xml.sax.ErrorHandlerインターフェイスの
            // 実装クラスを、DocumentBuilderインターフェイスのsetErrorHandler()メソッドに
            // 渡して、ErrorHandlerインターフェイスの実装クラスでエラー処理をする必要が
            // あります。

            System.out.println( "4:パーシング完了。" );
            // 4:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }

        // 例5:XMLがDTD通りの場合(DTDパブリック)
        byteArrayInputStream = null;
        try
        {
            // XMLの文字コードです。
            String XML_TEXT_ENCODE = "UTF-8";
            // XMLです。DTD通りではないXMLです。
            final String XML_TEXT
                = "<?xml version='1.0' encoding='UTF-8'?>\n"
                + "<!DOCTYPE \n"
                + "    web-app PUBLIC \"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN\"\n"
                + "    \"http://java.sun.com/dtd/web-app_2_3.dtd\">\n"
                + "<web-app>\n"
                + "    <servlet>\n"
                + "        <servlet-name>サーブレット名</servlet-name>\n"
                + "        <servlet-class>a.class</servlet-class>\n"
                + "    </servlet>\n"
                + "</web-app>\n"
                ;

            // この文字列を、UTF-8形式のbyte型配列として取り出します。
            byte[] bytes = XML_TEXT.getBytes( XML_TEXT_ENCODE );
            // そのbyte型配列を対象とする、ByteArrayInputStreamクラスを用意します。
            byteArrayInputStream = new ByteArrayInputStream( bytes );

            // パーサーを作ります。
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setValidating( true );
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            
            // パーシングします。
            Document document = documentBuilder.parse( byteArrayInputStream );
            System.out.println( "5:パーシング完了。" );
            // 5:パーシング完了。
        }
        catch( UnsupportedEncodingException e )
        {
            // StringクラスのgetBytes()メソッドで、存在しない文字コードを
            // 指定された場合にこの例外が投げられます。
            e.printStackTrace();
        }
        catch( ParserConfigurationException e )
        {
            // DocumentBuilderFactoryクラスのnewDocumentBuilder()メソッドの
            // 呼び出し中に失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( SAXException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        catch( IOException e )
        {
            // DocumentBuilderクラスのparse()メソッドの呼び出しで
            // パーシングに失敗するとこの例外が投げられます。
            e.printStackTrace();
        }
        finally
        {
            // 最後にclose()メソッドを呼んで後処理をします。
            // また、これは必ず行うため、finally内で行います。
            try
            {
                if( byteArrayInputStream != null )
                {
                    byteArrayInputStream.close();
                }
            }
            catch( IOException e )
            {
                e.printStackTrace();
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/12/01
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。