通过JAXB实现XML和对象之间的映射
?
???????? JAXB的全称是Java Architecture for XML Binding,是一项可以通过XML产生Java对象,也可以通过Java对象产生XML的技术。JDK中关于JAXB部分有几个比较重要的接口或类,如:
?? JAXBContext:它是程序的入口类,提供了XML/Java绑定的操作,包括marshal、unmarshal等。
?? Marshaller:它负责把Java对象序列化为对应的XML。
?? Unmarshaller:它负责把XML反序列化为对应的Java对象。
?
???????? 进行序列化的基本操作步骤如下:
?? //1、获取一个基于某个class的JAXBContext,即JAXB上下文
?? JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());
?? //2、利用JAXBContext对象创建对象的Marshaller实例。
?? Marshaller marshaller = jaxbContext.createMarshaller();
?? //3、设置一些序列化时需要的指定的配置
?? marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
??? marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
??? StringWriter writer = new StringWriter();
??? //4、将对象进行序列化
??? marshaller.marshal(obj, writer);
?
1、? 创建一个JAXB上下文对象。
2、? 利用JAXB上下文对象创建对应的Marshaller对象。
3、? 指定序列化时的配置参数,具体可以设置的参数和对应的参数的含义可以参考API文档。
4、? 最后一步是将对应的对象序列化到一个Writer、OutputStream、File等输出对象中,具体可以参考Marshaller接口的API文档。
?
???????? 使用JAXB进行对象的序列化时对应的对象类型必须是javax.xml.bind.JAXBElement类型,或者是使用了javax.xml.bind.annotation.XmlRootElement注解标注的类型。XmlRootElement用于标注在class上面,表示把一个class映射为一个XML Element对象。与之相配合使用的注解通常还有XmlElement和XmlAttribute。XmlElement注解用于标注在class的属性上,用于把一个class的属性映射为一个XML Element对象。XmlAttribute注解用于标注在class的属性上,用于把一个class的属性映射为其class对应的XML Element上的一个属性。
?
Person类
@XmlRootElement
publicclass Person {
?
?? private Integer id;
?? private String name;
?? private Integer age;
?? private Address address;
?
?? @XmlAttribute(name = "id")
?? public Integer getId() {
????? returnid;
?? }
?
?? publicvoid setId(Integer id) {
????? this.id = id;
?? }
?
?? @XmlAttribute
?? public String getName() {
????? returnname;
?? }
?
?? publicvoid setName(String name) {
????? this.name = name;
?? }
?
?? @XmlElement
?? public Integer getAge() {
????? returnage;
?? }
?
?? publicvoid setAge(Integer age) {
????? this.age = age;
?? }
?
?? @XmlElement
?? public Address getAddress() {
????? returnaddress;
?? }
?
?? publicvoid setAddress(Address address) {
????? this.address = address;
?? }
?
}
?
Address类
?
@XmlRootElement
publicclass Address {
?
?? private Integer id;
?? private String province;
?? private String city;
?? private String area;
?? private String other;
?
?? @XmlAttribute(name="id")
?? public Integer getId() {
????? returnid;
?? }
?
?? publicvoid setId(Integer id) {
????? this.id = id;
?? }
?
?? @XmlElement
?? public String getProvince() {
????? returnprovince;
?? }
?
?? publicvoid setProvince(String province) {
????? this.province = province;
?? }
?
?? @XmlElement
?? public String getCity() {
????? returncity;
?? }
?
?? publicvoid setCity(String city) {
????? this.city = city;
?? }
?
?? @XmlElement
?? public String getArea() {
????? returnarea;
?? }
?
?? publicvoid setArea(String area) {
????? this.area = area;
?? }
?
?? @XmlElement
?? public String getOther() {
????? returnother;
?? }
?
?? publicvoid setOther(String other) {
????? this.other = other;
?? }
?
}
?
测试方法
?? @Test
?? publicvoid testMarshal() throws JAXBException {
????? JAXBContext context = JAXBContext.newInstance(Person.class);
????? Marshaller marshaller = context.createMarshaller();
????? marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
????? StringWriter writer = new StringWriter();
????? Person person = new Person();
????? person.setId(1);
????? person.setName("张三");
????? person.setAge(30);
????? Address address = new Address();
????? address.setId(1);
????? address.setProvince("广东省");
????? address.setCity("深圳市");
????? address.setArea("南山区");
????? address.setOther("其它");
????? person.setAddress(address);
?????
????? marshaller.marshal(person, writer);
????? System.out.println(writer.toString());
?? }
?
输出结果
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person id="1" name="张三">
??? <address id="1">
??????? <area>南山区</area>
??????? <city>深圳市</city>
??????? <other>其它</other>
??????? <province>广东省</province>
??? </address>
??? <age>30</age>
</person>
?
???????? 进行反序列化的基本步骤如下:
?? //1、创建一个指定class的JAXB上下文对象
?? JAXBContext context = JAXBContext.newInstance(Person.class);
?? //2、通过JAXBContext对象创建对应的Unmarshaller对象。
?? Unmarshaller unmarshaller = context.createUnmarshaller();
?? File file = new File("D:\\person.xml");
?? //3、调用Unmarshaller对象的unmarshal方法进行反序列化,接收的参数可以是一个InputStream、Reader、File等
?? Person person = (Person) unmarshaller.unmarshal(file);
?
???????? Unmarshaller对象在提供了一系列的unmarshal重载方法,对应的参数类型可以是File、InputStream、Reader等,具体的可以查看对应的API文档。
?
???????? 除了使用JAXBContext来创建Marshaller和Unmarshaller对象来实现Java对象和XML之间的互转外,Java还为我们提供了一个工具类JAXB。JAXB工具类提供了一系列的静态方法来简化了Java对象和XML之间的互转,只需要简单的一行代码即可搞定。
?
?? @Test
?? publicvoid testMarshal1() {
????? Person person = new Person();
????? person.setId(1);
????? person.setName("张三");
????? person.setAge(30);
????? Address address = new Address();
????? address.setId(1);
????? address.setProvince("广东省");
????? address.setCity("深圳市");
????? address.setArea("南山区");
????? address.setOther("其它");
????? person.setAddress(address);
????? JAXB.marshal(person, System.out);
?? }
?
?? @Test
?? publicvoid testUnmarshal1() {
????? File xml = new File("D:\\person.xml");
????? Person person = JAXB.unmarshal(xml, Person.class);
????? System.out.println(person);
?? }
?
?
原文:http://haohaoxuexi.iteye.com/blog/2292429