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>
タグ名を指定
デフォルトではクラス名やメンバ名がタグに使用されるが、これらの値は以下のように指定することもできる。
ソース
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 = "hoge fuga ";
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 {
// 〜
}