今月から再びJava SE 6完全攻略に戻りましょう。

4月にはJava SE 6におけるXMLに関する新機能ということで,StAXを紹介しました。今月もXMLに関する新機能であるJava Architecture for XML Binding,通称JAXBを紹介します。

JAXBはJava SE 6より一足早く,Java EE 5で採用されていたので,ご存じの方も多いはずです。

JAXBを説明する前に,XMLを用いてデータ交換を行なう場合について考えてみましょう。

通常,JavaのアプリケーションでXMLドキュメントを扱う場合,XMLドキュメントをパースし,パースした内容をアプリケーションで扱いやすいオブジェクトに変換します。

たとえば,次のような名前を表すXMLがあったとします。

<name first="Yuichi" last="Sakuraba" />

これをアプリケーションでは次のように表すのではないでしょうか。

public class Name {
private String first; private String last; <<以下,省略>> } or String first = ...; String last = ...;

最初の例は名前を表すクラスを作成して使用します。後の例は単に変数に名と姓を代入するだけのものです。

もちろん,これは例であって,それ以外の表し方があるかもしれません。

重要なことはXMLドキュメントをアプリケーションで扱うには,XMLをパースして,アプリケーションで扱えるように何らかの形式に変換する必要があるということです。

とはいうものの,アプリケーションごとにXMLドキュメントから,何らかの形式に変換することは,なかなか大変です。

そこで,登場するのがJAXBです。

JAXBはXMLドキュメントを読み込み,対応するJavaオブジェクトを生成します。また,JavaオブジェクトからXMLドキュメントを作成することも可能です。

ただし,オブジェクトを生成するには,クラスの定義が必要です。Javaのオブジェクトに対するクラスの関係は,XMLドキュメントに対するスキーマと同じになります。つまり,XMLドキュメントの中でどのようなタグを使用しているか,属性は何かなどを定義しているのがスキーマです。

スキーマにはXML Schemaが多く使われますが,その他にもDTDやRelax NGなどがあります。

JAXBは,このスキーマからJavaのクラスを生成します。また,Javaのクラスからスキーマを生成することも可能です。

これがJAXBの名前になっているバインディングです。

XMLからJavaオブジェクトを生成するのはアンマーシャリング(Unmarshalling),JavaオブジェクトからXMLドキュメントを生成するのはマーシャリング(Marshalling)と呼びます。

この関係をまとめたのが図1です。

JAXBバインディングプロセス
図1 JAXBバインディングプロセス

スキーマからJavaクラスへのバインド

それでは,さっそくスキーマからJavaのクラスを生成してみましょう。ここでは,スキーマとしてXLM Schemaを使用します。本記事では特にXML Schemaの解説はしませんが,必要であればW3CのXML Schema Part 0: Primerなどを参照してください。

スキーマからJavaクラスを生成するためには,スキーマコンパイラxjcを使用します。

例として,次に示す簡単なXML Schemaで表したスキーマを用いてみます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0"
     xmlns:xs="http://www.w3.org/2001/XMLSchema">
 
  <xs:element name="person">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="age" type="xs:int"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

このXML Schemaは,personタグを定義しています。personタグにはnameとageという属性があり,それぞれ型が文字列と整数だということを表しています。

XML Schemaで定義されている型についてはXMLSchema Part2: Datatypesを参照してください。

このスキーマを,xjcを用いてJavaのクラスに変換してみましょう。スキーマのファイル名はperson.xsdで,c:\jaxbに存在するとします。ここでは,Windows Vistaを使用しました。

C:\jaxb>xjc person.xsd
parsing a schema...
compiling a schema...
generated\ObjectFactory.java
generated\Person.java

すると,直下にgeneratedディレクトリが作成され,ObjectFactory.javaとPerson.javaの二つのファイルが作成されました。

まず,ObjectFactory.javaファイルです。名前からして,ファクトリのクラスだということは明白です。

生成されたクラスにはコメントやアノテーションが挿入されていますが,ここでは省略します。アノテーションについては来週以降,別途説明します。

package generated;
 
public class ObjectFactory {
    public ObjectFactory() {
    }
 
    public Person createPerson() {
        return new Person();
    }
}

ObjectFactoryクラスでは,Personオブジェクトを生成するcreatePersonメソッドが定義されています。