首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

JAXB的XML与POJO种的简单转换

2012-12-21 
JAXB的XML与POJO类的简单转换在解析XML时候,最方便的方法就属 JAXB了。它可以将一个XML 转换成一个POJO 实

JAXB的XML与POJO类的简单转换
在解析XML时候,最方便的方法就属 JAXB了。
它可以将一个XML 转换成一个POJO 实例,也可以将一个POJO 实例写入XML文件,而且可以不需要xsd、DTD等文件。当然JAXB也可以通过 XSD 文件自动生成 POJO 类。

对于已知格式的XML分析,这是最简单的方法了。
最重要的方法就是 toXML 和 createInstanceFromXML,以及是POJO类中 XML无素的声明。

@Xml..... 的声明,可以放在setter  或 getter 方法上,任何一个都可以。
但不要把声明放在成员变量上,这将导致出错。
那么把成员变量声明为public 也会导致 IllegalAnnotationExceptions。

下面是一个主要的POJO类 。

import java.io.Reader;import java.io.StringWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.JAXBException;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class Customer {    String name;    int age;    int id;    private Address contact;    public String getName() {        return name;    }    @XmlElement    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    @XmlElement    public void setAge(int age) {        this.age = age;    }    public int getId() {        return id;    }    @XmlAttribute    public void setId(int id) {        this.id = id;    }    @Override    public String toString() {        return String.format("%s[id=%d,name=%s,age=%d,contact=%s", getClass().getName(), getId(), getName(), getAge(), getContact());    }    @XmlElement    public Address getContact() {        return contact;    }    public void setContact(Address contact) {        this.contact = contact;    }    public String toXML() throws JAXBException {        //writer,用于保存XML内容        StringWriter writer = new StringWriter();        //获取一个关于Customer类的 JAXB 对象        JAXBContext context = JAXBContext.newInstance(Customer.class);        //由  Jaxbcontext 得到一个Marshaller(马歇尔)        Marshaller marshaller = context.createMarshaller();        //设置为格式化输出,就是XML自动格式化。        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);        //使用marshaller将对象输出到writer。        marshaller.marshal(this, writer);        //writer.toString(),将所有写入的内容转成String        return writer.toString();    }    public static Customer createInstanceFromXML(Reader reader) throws JAXBException {        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);        //marshaller是类到XML 的转化,那么 unmashaller是XML到类的转化。        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();        Customer customer = (Customer) jaxbUnmarshaller.unmarshal(reader);        return customer;    }}

下面是Customer中引用到的POJO类。
import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;public class Address {    private String addr;    private String postno;    private int id;    @Override    public String  toString(){        return String.format("Address[%s,%s,%d]", addr,postno,id);    }    public Address() {        setAddr("default");        setPostno("000000");        setId(1);    }    @XmlElement    public String getAddr() {        return addr;    }    public void setAddr(String addr) {        this.addr = addr;    }    @XmlElement    public String getPostno() {        return postno;    }    public void setPostno(String postno) {        this.postno = postno;    }    @XmlAttribute    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }}


最后,我们测试一下这个Customer类。
Customer customer = new Customer();        customer.setId(100);        customer.setName("jaxbExample");        customer.setAge(20);        customer.setContact(new Address());//将Customer对象输出XML信息            System.out.println(customer.toXML());            //从XML文件生成一个Customer对象            File file = new File("d:\\tmp\\file.xml");            java.io.InputStreamReader sr = new InputStreamReader(new FileInputStream(file));            Customer cust = Customer.createInstanceFromXML(sr);            sr.close();            System.out.println(cust);

结果,它很好的运行了。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><customer id="100">    <age>20</age>    <contact id="1">        <addr>default</addr>        <postno>000000</postno>    </contact>    <name>jaxbExample</name></customer>Customer[id=100,name=jaxbExample,age=20,contact=Address[default,000000,1]


继续,再来看看Address类,类里也有XML声明。如果把Address类中的XML声明都去除,JAXB仍可以正常执行,只是Address类的成员都自动变成了XML的contact下的Element。
那么从执行来看,只要没有特殊要求,Address类不需要声明,任何的POJO类都可以被Marshaller。只需要把类声明为@XmlRootElement 就可以,其它的都不需要声明。下面给出一个运行结果。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pJaxb>
    <contact>
        <addr>default</addr>
        <id>1</id>
        <postno>000000</postno>
    </contact>
    <name>name1</name>
    <pass>pass2</pass>
</pJaxb>
@XmlRootElementpublic class PJaxb {    private String name;    private String pass;    private Address contact;    //以下略去 3个setter和getter对,没有XML声明,toXML方法。

热点排行