Sunflat のブログ

ソフトウェア開発についての話題が多いかも

JAXB (Java XML Binding)

最近、JavaXMLを取り扱うことがあったのだが、DOMやSAXとかを使って解析するのは結構面倒くさい。
Java 6からは、XML SchemaからJavaクラスを生成してくれるJAXBというライブラリが標準添付されていて、とっても便利。(Relax NGDTDにも対応してるらしい)
正しい構造のXMLを生成していることを静的にチェックできるし、Eclipseを使っていればどのような子Elementがあるか補完で分かるし、検証や名前空間の扱いとかも楽々。


クラスの生成は、JDK6を入れて以下のコマンドを実行すればOK!

xjc -p 出力先パッケージ名 -d 出力先ディレクトリ XMLスキーマファイル.xsd


あとは、Unmarshallerを使ってXML文書の解析が行える。

JAXBContext context=JAXBContext.newInstance("↑で生成したパッケージ名(複数なら:区切り)");
Unmarshaller unmarshaller=context.createUnmarshaller();
JAXBElement<?> myElement=(JAXBElement<?>)unmarshaller.unmarshal(XMLデータの入力元InputStream);


Marshallerを使えば、XMLの生成が行える。

Marshaller marshaller=context.createMarshaller();
JAXBElement<MyElementType> myElement=ObjectFactory.createMyElement(...);
marshaller.marshal(myElement, XMLデータの出力先OutputStream);


生成されるクラスにちょっとクセがあって、XML Schema

<xsd:element name="my_element" type="MyElementType" />

のように、(匿名typeではなく)elementとtypeの定義が別になっていると、my_elementに相当するクラスは作成されず、代わりにJAXBElementを使うみたい。
ただし、(生成されたクラスの中で)JAXBElementのみを受け渡しするメソッドでは、この部分が最適化されて、代わりにMyElementTypeを受け渡しするようだ。このあたりがちょっと分かりにくかった。