続:JDeveloper で JAXB プログラミング

年末年始の休みを挟んじゃいましたが、今度は、複数のBookデータを格納できるようなコードにします。
まずは、複数データを保持できるXMLスキーマを作成し、それに対応するようにJavaコードも変えます。でも、基本的なプログラミング手順は前回と同じで、

  1. XMLスキーマの作成
  2. JAX-B Compilerの実行
  3. 追加コーディング

です。コードが混じらないよう、新しいプロジェクトで作ります。

XMLスキーマの作成

前回と同じような手順で、XMLスキーマ・ダイアグラムを利用して、次のようなダイアグラムを作成します。

このコードは次のとおりです。

<?xml version="1.0" encoding="windows-31j" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns="http://jkidd.com/book"
            targetNamespace="http://jkidd.com/book"
            elementFormDefault="qualified">
  <xsd:element name="bookData">
    <xsd:annotation>
      <xsd:documentation>
        A sample element
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexType>
      <xsd:sequence maxOccurs="unbounded">
        <xsd:element name="book">
          <xsd:complexType>
            <xsd:attribute name="price"/>
            <xsd:attribute name="title"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

JAX-B Compilerの実行

前回同様、book.xsdに対して、JAX-B Compilerを実行します。
パッケージ:com.jkidd.xml、テスト・クライアント: TestMain とします。

追加コーディング

今回は、テスト・クライアント・クラスのmainメソッドのtryブロック内を次のようにします。

  context = JAXBContext.newInstance("com.jkidd.xml");
  ObjectFactory factory = new ObjectFactory();

  // 新規データの作成
  BookData bookData = factory.createBookData();
  BookDataType.Book book1 = factory.createBookDataTypeBook();
  book1.setTitle("JAX-Bプログラミング");
  book1.setPrice("12000");
  BookDataType.Book book2 = factory.createBookDataTypeBook();
  book2.setTitle("JAX-Bプログラミング応用編");
  book2.setPrice("25000");
  bookData.getBook().add(book1);
  bookData.getBook().add(book2);

  // データ書き出し用オブジェクト(マーシャラ)の用意
  Marshaller marshaller = context.createMarshaller();
  File file = new File("c:\\users\\test2.xml");
  if (!file.exists())
    file.createNewFile();
  OutputStream out = new FileOutputStream( file );

  //出力を整形する
  marshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
  // 書き出し
  marshaller.marshal(bookData, out);

これを実行すると、c:\users\test2.xml にデータが書き込まれます。今回は、XML書式を整形して出力するよう、ひとつプロパティを設定しています。
この2つの例のように、XML書き出しは Marshaller#marshal を使いますが、読み込みは、Ummarshaller#unmarshal を使用します。大体コードが想像できますよね!?