2009年11月25日水曜日

JAXBの使い方メモ(2009/11/25更新)

最も基本的なアノテーション

次のようなXMLをクラスにマッピングする。

<root-element attr="abc">
    <sub-element></sub-element>
</root-element>

アノテーションのつけ方はこんな感じ。

@XmlRootElement(name="root-element")
public class RootElem {

    @XmlElement(name="sub-element")
    public String subElem;

    @XmlAttribute
    public String attr;
}

インデックスファイル

バインディングしたいクラスのパッケージにjaxb.indexというファイルを作る。
中身はパッケージなしのクラス名を1行に1つずつ書いたテキストファイル。後述のJAXBContextで指定したパッケージからこのインデックスファイルが読まれる。

継承

abstract public class SuperClass {
    @XmlAttribute
    public String name;
}

@XmlRootElement(name="subclassA")
public class SubClassA extends SuperClass {

    public String value;
}

@XmlRootElement(name="subclassB")
public class SubClassB extends SuperClass {

    @XmlAttribute
    public int c;

    @XmlAttribute
    public int value;
}

マーシャリング(XML生成)

// jaxbtext.entityパッケージのクラスを対象にする
JAXBContext context = JAXBContext.newInstance("jaxbtest.entity");
RootElem root = <出力するオブジェクト>
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
Writer out = new OutputStreamWriter(new FileOutputStream("output/marshal.xml"), "utf-8");
marshaller.marshal(root, out);
out.close();

アンマーシャリング(XML読み込み)

JAXBContext context = JAXBContext.newInstance("jaxbtest.entity");
Unmarshaller unmarshaller = context.createUnmarshaller();
RootEntity obj = (RootEntity)unmarshaller.unmarshal(new File("output/marshal.xml"));