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; }}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 = 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]
@XmlRootElementpublic class PJaxb { private String name; private String pass; private Address contact; //以下略去 3个setter和getter对,没有XML声明,toXML方法。