目次へ

4.3 FlatXmlDataSetとDTD

ところで、FlatXmlDataSetではXML見てテーブルの構造を判断しています。例えば、4.2のsample_data.xmlを読み込んだ場合、「TEST_TABLEはCOL0、COL1、COL2の3つのカラムを持つテーブル」とみなされます。それでは、XMLを以下のように変更したらどうなるでしょう。

sample_data2.xml
 <dataset>
   <TEST_TABLE COL1="row 1 col 1"/>
   <TEST_TABLE COL0="row 0 col 0" COL1="row 0 col 1" COL2="row 0 col 2"/>
   <SECOND_TABLE COL0="row 0 col 0" COL1="row 0 col 1" />
</dataset>

TEST_TABLE 要素を入れ替えました。 上述している通り、FlatXmlDataSetは、TEST_TABLEテーブルがどのようなカラムを持つかを「最初のTEST_TABLE要素の属性」で判断します。 ですから、sample_data2.xmlを読み込んだ場合、「TEST_TABLEはCOL1カラムを1つだけ持つテーブル」とみなされます。 よって、3行目で、COL0やCOL2の属性を指定しても全て無視されてしまいます。

 このような事態は、テーブルの構造を表すDTDを作成し指定すれば解決します。例えば、以下のようなDTDを作成します。

sample_table.dtd
<!ELEMENT dataset (
     TEST_TABLE*,
     SECOND_TABLE*,
     EMPTY_TABLE*)>

<!ELEMENT TEST_TABLE EMPTY>
<!ATTLIST TEST_TABLE
     COL0 CDATA #IMPLIED
     COL1 CDATA #REQUIRED
     COL2 CDATA #IMPLIED >

<!ELEMENT SECOND_TABLE EMPTY>
<!ATTLIST SECOND_TABLE
     COL0 CDATA #REQUIRED
     COL1 CDATA #IMPLIED >

このDTDでは、TEST_TABLE要素が3つの属性を持つことを示しています。そして、データセットを表すXMLで上のDTDを指定します。

sample_data2_with_dtd.xml
<!DOCTYPE dataset SYSTEM "sample_table.dtd">
<dataset>
   <TEST_TABLE COL1="row 1 col 1"/>
   <TEST_TABLE COL0="row 0 col 0" COL1="row 0 col 1" COL2="row 0 col 2"/>
   <SECOND_TABLE COL0="row 0 col 0" COL1="row 0 col 1" />
</dataset>

DTDを指定することにより、COL0、COL1、COL2の3つのカラムにデータを持つデータを作成することができます。FlatXmlDataSetでXMLを出力する場合に、DOCTYP宣言も出力する場合は、以下のように「setDocType()」メソッドを使用します。

 FlatXmlWriter datasetWriter = new FlatXmlWriter( 
       new FileOutputStream("dataset.xml")); 

 datasetWriter.setDocType("dataset.dtd"); 
 datasetWriter.write(dataSet);

実習課題1

2章の実習課題2を修正しなさい。

  • Customerテーブルにofficeカラムがnullのデータを追加する。
  • CustomerBeanのテストクラスに、loadByC_numメソッドでofficeカラムがnullのデータも取得できるか確認するメソッドを追加する。
  • テストデータ(を表すXML)には、DTDを指定する。
  • DTDを指定しなかった場合に、不具合が発生することを確かめる。

実習課題2

バックアップでDOCTYPE宣言を出力するように変更せよ。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp