Selasa, 18 Desember 2012

[JAXB] Write Object in XML

Hari ini mau tulis tentang JAXB (Java Architecture Xml Binding), fungsinya sama dengan jdom yakni bisa digunakan write dan read object ke xml. Tapi perbedaannya dengan jdom, jaxb menggunakan anotation yang digunakan untuk mendefinisikan element dan attribut.
Langsung aja ke kode yang simple ya, 

Dibawah ini object root element di file xml;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author user
 */
@XmlRootElement(name= "costumer")
public class Costumer {
    String id;
    String name;
    String age;

    @XmlElementWrapper(name = "value")
    @XmlElement(name="atr")
    AttrCostumer atr[];

    public AttrCostumer[] getAtrs() {
        return atr;
    }

    public void setAtr(AttrCostumer[] atr) {
        this.atr = atr;
    }
 
    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
Dibawah ini adalah inner object yang  akan digunakan sebagai element pada root element.
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;

/**
 *
 * @author user
 */
public class AttrCostumer {
    @XmlAttribute(name="dress")
    String dress;

    @XmlValue
    String valueDress;

}

Dan dibawah ini adalah class mainnya,
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

/**
 *
 * @author user
 */
public class MainBuildArr {
    public static void main(String[] args) {
        Costumer cst = new Costumer();
        cst.setId("1");
        cst.setName("Ardi");
        cst.setAge("24");
        AttrCostumer at[] = new AttrCostumer[3];
        for(int i = 0; i < 3; i++) {
            at[i] = new AttrCostumer();
            at[i].dress = "co"+i+"- dress";
            at[i].valueDress = i+".000";
        }
        cst.setAtr(at);
        
        try {
            File file = new File("file.xml");
            JAXBContext jxbctx = JAXBContext.newInstance(Costumer.class);
            Marshaller marshall = jxbctx.createMarshaller();
            marshall.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshall.marshal(cst, System.out);
            marshall.marshal(cst, file);
        } catch (JAXBException ex) {
            Logger.getLogger(MainBuildArr.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Jika dirun maka akan mencetak file.xml dan output seperti dibawah ini;
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<costumer>
    <value>
        <atr dress="co0- dress">0.000</atr>
        <atr dress="co1- dress">1.000</atr>
        <atr dress="co2- dress">2.000</atr>
    </value>
    <age>24</age>
    <id>1</id>
    <name>Ardi</name>
</costumer>

Sebagai catatan :
- Dalam mendefinisikan object kita harus mendefinisikan root element menggunakan @XmlRootElement.
- Tidak boleh memiliki property element yang sama, misalnya pada object Costumer fungsi getAtrs diganti getAtr maka akan terjadi error. Karena fungsi getAtr dan variabel atr itu merepresentasikan properti di element, makanya harus berbeda.
- Dan ini saya menggunakan jdk1.6 dan library jaxb 2.2
Agak sulit ya, tp itu sebagian catatan yang saya temui saat menggunakan jaxb. Tapi nanti kita lanjutkan lagi ya..

Wasaalam

0 komentar:

Posting Komentar