JAXB2.0

いまやJavaSEの標準APIになっているJAXB2.0。これを利用してJAX-WSWEBサービス)のシリアライズがされるようになったため、必須知識だ。

import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlRootElement;

public class Main {

public static void main(String[] args) throws JAXBException {

    StringWriter sw = new StringWriter();
    {

        Sample sample = new Sample();
        sample.id = 123;
        sample.name = "なまえ";
        sample.items = new ArrayList<Item>();
        sample.items.add(new Item(1,"あいてむ1"));
        sample.items.add(new Item(2,"あいてむ2"));
        sample.items.add(new Item(3,"あいてむ3"));

        //オブジェクトからXMLの作成
        JAXBContext.newInstance(Sample.class).createMarshaller().marshal(sample , sw);
        System.out.println(sw.toString());

    }

    {

        //XMLからオブジェクトの作成
        Sample newData = (Sample)JAXBContext.newInstance(Sample.class).createUnmarshaller().unmarshal(
        new StringReader(sw.toString()));
        System.out.printf("I D:%d\n名前:%s\n", newData.id , newData.name);
        for(Item item: newData.items){

            System.out.printf(" @:%d,%s\n", item.itemId , item.itemName);

        }

    }

}

}

//XMLのルート指定する必要あり
@XmlRootElement()
class Sample {

    public int id;
    public String name;
    public List<Item> items;

}

//サブ要素
class Item{

    public int itemId;
    public String itemName;

    public Item(){

    }
    public Item(int id,String name){

        this.itemId = id;
        this.itemName = name;

    }

}

結果は

run-single:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sample>
<id>123</id>
<name>なまえ</name>
<items><itemId>1</itemId><itemName>あいてむ1</itemName></items>
<items><itemId>2</itemId><itemName>あいてむ2</itemName></items>
<items><itemId>3</itemId><itemName>あいてむ3</itemName></items>
</sample>
I D:123
名前:なまえ
@:1,あいてむ1
@:2,あいてむ2
@:3,あいてむ3
構築成功 (合計時間: 0 秒)

となる。

単に扱えるのがわかるだろうか。文字列バッファのみでやり取りしているが、ここはFileを引数にとるものもあってそれを使うとファイル経由でのやり取りが可能だ。できあがるXMLも非常にシンプルなものになっている

引用元のネタは2007年1月10日の日記より
http://shin.cside.com/diary/2007/01.htm#10