進化したJAXB 2.0でJavaからXMLを操作する
<?xml version="1.0" encoding="UTF-8"?> <ticket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <company name="ABC Bank"> <address>60 Wall Street, New York, NY</address> <contact name="Peter Mikhalenko" email="peter@mikhalenko.ru" telephone="1234567890"/> </company> <flight from="New York" to="San Francisco"/> <flight from="Los Angeles" to="New York"/> </ticket>
このXMLファイルに対するスキーマがtickets.xsdという名前で存在し、1つのticketと2つのflightが含まれているとする。その場合、JAXBコンパイラを実行するには、xjcというコマンドラインのツールを用いて以下のように入力する。
$xjc tickets.xsd -p fullclassname.ticket -d src/generated
上記のコマンドを実行すると、JAXB 2.0のアノテーションが付加されたクラスが複数生成されるはずである。
バインディングランタイムフレームワーク
XMLドキュメントのアンマーシャリングを行うには、JAXBのコンテキストからUnmarshallerオブジェクトを作成する必要がある。Unmarshallerオブジェクトを用いると、ファイルや入力ストリーム、URL、DOMオブジェクト、SAXパーサなど、さまざまなデータソースからXMLデータを取得して処理できる。
次の例では、まず(マーシャリング、アンマーシャリング、妥当性検証を始める際に最初に必要となる)JAXBContextコンテキストオブジェクトを作成している。ここでは、XMLドキュメントとしては普通のFileオブジェクトを用いている。unmarshallerが型付けされたJAXBElementオブジェクトを返すので、そのオブジェクトのgetValue()メソッドを呼び出してアンマーシャリングされたTicketオブジェクトを取得している。
JAXBContext jaxbContext
= JAXBContext.newInstance
("fullclassname.ticket ");
Unmarshaller unmarshaller =
jaxbContext.createUnmarshaller();
JAXBElement<Ticket> ticketElement
= (JAXBElement<Ticket>) unmarshaller.unmarshal(
new File("src/test/resources/xml/ticket.xml"));
Ticket ticket = ticketElement.getValue();
一方、マーシャリングを行う際にはJavaのクラスをXML形式に変換する処理が必要となる。JAXB 2.0では、XMLを(XMLスキーマを利用して)通常のクラスとして扱うことによって、簡単にJavaのクラスを作成し操作することができる。以下の例を見て欲しい。ドメインオブジェクトの初期化を行ったのち、JAXBContextオブジェクトを用いてMarshallerオブジェクトと型付けされたJAXBElementオブジェクトを作成している。そして、作成されたJAXBElementオブジェクトを用いてドメインオブジェクトのカプセル化を行っている。このJAXBElementオブジェクトは、XMLドキュメントではルート要素のcomplexTypeに対応する。最後に、ここまでの操作を行ったのちに生成したObjectFactoryクラスを用いて以下のような操作を行う。
Ticket ticket = new Ticket();
ticket.setCompany("ABC Bank");
ticket.setFlight("New York","San Francisco");
ObjectFactory factory = new ObjectFactory();
Ticket booking = factory.createTicket();
Marshaller marshaller = jaxbContext.createMarshaller();
JAXBElement<Ticket> ticketElement = (new ObjectFactory()).createTicket(ticket);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal( ticketElement, System.out );
まとめ
JAXB 2.0を用いると、JavaアプリケーションでXMLコンテンツを簡単に扱えるようになる。XMLドキュメントのXSDスキーマを利用することによって、XMLドキュメントからJavaBeansへのバインディングが行えるようになるのである。
このトピックについてより深く学びたい方は、JAXB 2.0 Reference Implementation Projectを参照するとよいだろう。
- ホワイトペーパー



