JAXB2を使ったXMLスキーマレスなバインディングについて
JAXBとはJavaでXMLを扱うためのバインディング技術です。
JAXBでは、JavaとXMLのバインディングにXMLスキーマを用いるのが一般的です。
しかし、JAXB2.0からはXMLスキーマではなくアノーテーションを使用することができるため、POJOとXMLのバインディングが可能です。
簡単ながら、その場合のアンマーシャル、マーシャルの例が以下になります*1。
package sample.jaxb; import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Person { @XmlElement String name; public static void main(String[] args) { Person person = new Person(); person.name = "cactusman"; JAXBContext context = null; try { context = JAXBContext.newInstance(Person.class); Marshaller marshaller = context.createMarshaller(); marshaller.marshal(person, new File("person.xml")); } catch (JAXBException e) { e.printStackTrace(); } person = null; try { Unmarshaller unmarshaller = context.createUnmarshaller(); person = (Person)unmarshaller.unmarshal(new File("person.xml")); } catch (JAXBException e) { e.printStackTrace(); } } }
マーシャルしたXMLファイル
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><person><name>cactusman</name></person>
違いといえば、JAXBContext.newInstanceの引数にパッケージ名もしくはObjectFactoryクラスを渡すところが、POJOのクラスになっています。
また、アノーテーションで要素が一つ以上などのもっと細かい指定を行うことができるようです。
例えば、@XmlElement(name="ElementName")とするとXMLの要素名をフィールド名ではなく別の名前(ここではElementName)に変更できたりします。
POJOで使ってみた感じでは、XMLスキーマの作成やコンパイル時にソースジェネレートのフェイズが必要ないため、手軽に使えるようになった感じです。
さくっとデータをXMLにバインドするにはうってつけじゃないんでしょうか。
*1:Java6からはJAXBが導入されているため、Java6ならJAXBをダウンロードする必要がないです。