魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

JAXB

投稿日:
タグ:

JavaでXMLを使用する際、JAXB(Java Architecture for XML Binding)を使用すると便利である。

JAXBの基本

ソース
import javax.xml.bind.JAXB;

class Bean {
    /** 属性 */
    private String val;

    /** 属性のセッター */
    public void setVal(String val){this.val = val;}
    /** 属性のゲッター */
    public String getVal(){return val;}
}


class Sample {
    public static void main(String args[]){
	Bean b = new Bean();
	
	b.setVal("hoge");
	JAXB.marshal(b, System.out);
    }
}
実行結果
user% java Sample
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<bean>
<val>hoge</val>
</bean>
marshalがエンティティからXMLの文字列やXMLをストリームへ出力する際に使用する。

タグ名を指定

デフォルトではクラス名やメンバ名がタグに使用されるが、これらの値は以下のように指定することもできる。

ソース
import javax.xml.bind.JAXB;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;

@XmlRootElement(name = "root")
class Bean {
    /** 属性 */
    private String val;


    /** 属性のセッター */
    public void setVal(String val){this.val = val;}
    /** 属性のゲッター */
    @XmlElement(name = "val1")
    public String getVal(){return val;}
}

class Sample {
    public static void main(String args[]){
	Bean b = new Bean();
	
	b.setVal("hoge");
	JAXB.marshal(b, System.out);
    }
}
実行結果
user% java Sample
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<val1>hoge</val1>
</root>

属性を設定

また、次のようにしてメンバを属性として扱うこともできる。

ソース
import javax.xml.bind.JAXB;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlAttribute;

@XmlRootElement(name = "root")
class Bean {
    /** 属性1 */
    private String val1;
    /** 属性2 */
    private String val2;

    /** 属性1のセッター */
    public void setVal1(String val1){this.val1 = val1;}
    /** 属性1のゲッター */
    @XmlElement(name = "val1")
    public String getVal1(){return val1;}
    /** 属性2のセッター */
    public void setVal2(String val2){this.val2 = val2;}
    /** 属性2のゲッター */
    @XmlAttribute(name = "val2")
    public String getVal2(){return val2;}
}

class Sample {
    public static void main(String args[]){
	Bean b = new Bean();
	
	b.setVal1("hoge");
	b.setVal2("fuga");
	JAXB.marshal(b, System.out);
    }
}
実行結果
user% java Sample
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root val2="fuga">
<val1>hoge</val1>
</root>

ゲッターの代わりに属性にアノテーションを付加

ソース
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.JAXB;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "root")
class Bean {
    @XmlElement(name = "val_1")
    private String val1;
    
    @XmlElement(name = "val_2")
    private String val2;
    
    public void setVal1(String val1){this.val1 = val1;}
    public String getVal1(){return val1;}
    public void setVal2(String val2){this.val2 = val2;}
    public String getVal2(){return val2;}
}


class Sample {
    public static void main(String args[]){
	Bean f = new Bean();
	
	f.setVal1("hoge");
	f.setVal2("fuga");
	JAXB.marshal(f, System.out);
    }
}
実行結果
user% java Sample
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<val_1>hoge</val_1>
<val_2>fuga</val_2>
</root>

XML読み込み

前述までと逆に、XMLの読み込みを行う場合はunmarshal()を使用する。
ソース
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.JAXB;
import java.io.StringReader;

@XmlRootElement(name = "root")
class Bean {
    @XmlElement(name = "val_1")
    private String val1;
    @XmlElement(name = "val_2")
    private String val2;
    
    public void setVal1(String val1){this.val1 = val1;}
    public String getVal1(){return val1;}
    public void setVal2(String val2){this.val2 = val2;}
    public String getVal2(){return val2;}
}

class Sample {
    public static void main(String args[]){
	String s = "hogefuga";
	System.out.println(s);
	
	Bean bean = (Bean)JAXB.unmarshal(new StringReader(s), Bean.class);
	System.out.println(bean.getVal1());
	System.out.println(bean.getVal2());
    }
}
実行結果
user% java Sample
<?xml version="1.0" encoding="UTF-8"
standalone="yes"?><root><val_1>hoge</val_1><val_2>fuga</val_2></root>
hoge
fuga

タグの順番を未指定

import javax.xml.bind.annotation.XmlAccessorOrder;
import javax.xml.bind.annotation.XmlAccessOrder;

@XmlAccessorOrder(XmlAccessOrder.UNDEFINED)
@XmlRootElement(name = "root")
class Bean {
  // 〜
}

一覧