JAXB(一)——初体验之实现XML和对象之间的映射

前端之家收集整理的这篇文章主要介绍了JAXB(一)——初体验之实现XML和对象之间的映射前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

@H_502_6@

JAXB的全称是Java Architecture for XML Binding,是一项可以通过XML产生Java对象,也可以通过Java对象产生XML的技术。JDK中关于JAXB部分有几个比较重要的接口或类,如:@H_502_6@

Ø JAXBContext:它是程序的入口类,提供了XML/Java绑定的操作,包括marshalunmarshal等。@H_502_6@

Ø Marshaller:它负责把Java对象序列化为对应的XML@H_502_6@

Ø Unmarshaller:它负责把XML反序列化为对应的Java对象。@H_502_6@

@H_502_6@

序列化@H_502_112@

进行序列化的基本操作步骤如下:@H_502_6@

//1获取一个基于某个classJAXBContext,即JAXB上下文@H_502_6@

JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());@H_502_6@

//2、利用JAXBContext对象创建对象的Marshaller实例。@H_502_6@

Marshaller marshaller = jaxbContext.createMarshaller();@H_502_6@

//3、设置一些序列化时需要的指定的配置@H_502_6@

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE); @H_502_6@

marshaller.setProperty(Marshaller.JAXB_FRAGMENT,Boolean.TRUE);@H_502_6@

StringWriter writer = new StringWriter(); @H_502_6@

//4、将对象进行序列化@H_502_6@

marshaller.marshal(obj,writer);@H_502_6@

@H_502_6@

1、 创建一个JAXB上下文对象。@H_502_6@

2、 利用JAXB上下文对象创建对应的Marshaller对象。@H_502_6@

3、 指定序列化时的配置参数,具体可以设置的参数和对应的参数的含义可以参考API文档。@H_502_6@

4、 最后一步是将对应的对象序列化到一个WriterOutputStreamFile输出对象中,具体可以参考Marshaller接口的API文档。@H_502_6@

@H_502_6@

使用JAXB进行对象的序列化时对应的对象类型必须是javax.xml.bind.JAXBElement类型,或者是使用了javax.xml.bind.annotation.XmlRootElement注解标注的类型。XmlRootElement用于标注在class上面,表示把一个class映射为一个XML Element对象。与之相配合使用的注解通常还有XmlElementXmlAttributeXmlElement注解用于标注在class属性上,用于把一个class属性映射为一个XML Element对象。XmlAttribute注解用于标注在class属性上,用于把一个class属性映射为其class对应的XML Element上的一个属性。默认情况下,当我们的一个属性没有使用XmlElement标注时也会被序列化为Xml元素的一个子元素,如果我们不希望Java对象中的某个属性被序列化则可以在对应的属性或对应的get方法上采用XMLTransient进行标注。@H_502_6@

@H_502_6@

示例

Person@H_502_6@

@XmlRootElement@H_502_6@

publicclass Person {@H_502_6@

@H_502_6@

private Integer id;@H_502_6@

private String name;@H_502_6@

private Integer age;@H_502_6@

private Address address;@H_502_6@

@H_502_6@

@XmlAttribute(name = "id")@H_502_6@

public Integer getId() {@H_502_6@

returnid;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setId(Integer id) {@H_502_6@

this.id = id;@H_502_6@

}@H_502_6@

@H_502_6@

@XmlAttribute@H_502_6@

public String getName() {@H_502_6@

returnname;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setName(String name) {@H_502_6@

this.name = name;@H_502_6@

}@H_502_6@

@H_502_6@

@XmlElement@H_502_6@

public Integer getAge() {@H_502_6@

returnage;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setAge(Integer age) {@H_502_6@

this.age = age;@H_502_6@

}@H_502_6@

@H_502_6@

@XmlElement@H_502_6@

public Address getAddress() {@H_502_6@

returnaddress;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setAddress(Address address) {@H_502_6@

this.address = address;@H_502_6@

}@H_502_6@

@H_502_6@

}@H_502_6@

@H_502_6@

Address@H_502_6@

@H_502_6@

@XmlRootElement@H_502_6@

publicclass Address {@H_502_6@

@H_502_6@

private Integer id;@H_502_6@

private String province;@H_502_6@

private String city;@H_502_6@

private String area;@H_502_6@

private String other;@H_502_6@

@H_502_6@

@XmlAttribute(name="id")@H_502_6@

public Integer getId() {@H_502_6@

returnid;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setId(Integer id) {@H_502_6@

this.id = id;@H_502_6@

}@H_502_6@

@H_502_6@

@XmlElement@H_502_6@

public String getProvince() {@H_502_6@

returnprovince;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setProvince(String province) {@H_502_6@

this.province = province;@H_502_6@

}@H_502_6@

@H_502_6@

@XmlElement@H_502_6@

public String getCity() {@H_502_6@

returncity;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setCity(String city) {@H_502_6@

this.city = city;@H_502_6@

}@H_502_6@

@H_502_6@

@XmlElement@H_502_6@

public String getArea() {@H_502_6@

returnarea;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setArea(String area) {@H_502_6@

this.area = area;@H_502_6@

}@H_502_6@

@H_502_6@

@XmlElement@H_502_6@

public String getOther() {@H_502_6@

returnother;@H_502_6@

}@H_502_6@

@H_502_6@

publicvoid setOther(String other) {@H_502_6@

this.other = other;@H_502_6@

}@H_502_6@

@H_502_6@

}@H_502_6@

@H_502_6@

测试方法@H_502_6@

@Test@H_502_6@

publicvoid testMarshal() throws JAXBException {@H_502_6@

JAXBContext context = JAXBContext.newInstance(Person.class);@H_502_6@

Marshaller marshaller = context.createMarshaller();@H_502_6@

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);@H_502_6@

StringWriter writer = new StringWriter();@H_502_6@

Person person = new Person();@H_502_6@

person.setId(1);@H_502_6@

person.setName("张三");@H_502_6@

person.setAge(30);@H_502_6@

Address address = new Address();@H_502_6@

address.setId(1);@H_502_6@

address.setProvince("广东省");@H_502_6@

address.setCity("深圳市");@H_502_6@

address.setArea("南山区");@H_502_6@

address.setOther("其它");@H_502_6@

person.setAddress(address);@H_502_6@

@H_502_6@

marshaller.marshal(person,writer);@H_502_6@

System.out.println(writer.toString());@H_502_6@

}@H_502_6@

@H_502_6@

输出结果@H_502_6@

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>@H_502_6@

<person id="1" name="张三">@H_502_6@

<address id="1">@H_502_6@

<area>南山区</area>@H_502_6@

<city>深圳市</city>@H_502_6@

<other>其它</other>@H_502_6@

<province>广东省</province>@H_502_6@

</address>@H_502_6@

<age>30</age>@H_502_6@

</person>@H_502_6@

@H_502_6@

反序列化@H_502_112@

进行反序列化的基本步骤如下:@H_502_6@

//1、创建一个指定classJAXB上下文对象@H_502_6@

JAXBContext context = JAXBContext.newInstance(Person.class);@H_502_6@

//2、通过JAXBContext对象创建对应的Unmarshaller对象。@H_502_6@

Unmarshaller unmarshaller = context.createUnmarshaller();@H_502_6@

File file = new File("D:\\person.xml");@H_502_6@

//3调用Unmarshaller对象的unmarshal方法进行反序列化,接收的参数可以是一个InputStreamReaderFile@H_502_6@

Person person = (Person) unmarshaller.unmarshal(file);@H_502_6@

@H_502_6@

Unmarshaller对象在提供了一系列的unmarshal重载方法,对应的参数类型可以是FileInputStreamReader等,具体的可以查看对应的API文档。@H_502_6@

@H_502_6@

JAXB工具类 @H_502_112@

除了使用JAXBContext来创建MarshallerUnmarshaller对象来实现Java对象和XML之间的互转外,Java还为我们提供了一个工具类JAXBJAXB工具类提供了一系列的静态方法来简化了Java对象和XML之间的互转,只需要简单的一行代码即可搞定。@H_502_6@

@H_502_6@

@Test@H_502_6@

publicvoid testMarshal1() {@H_502_6@

Person person = new Person();@H_502_6@

person.setId(1);@H_502_6@

person.setName("张三");@H_502_6@

person.setAge(30);@H_502_6@

Address address = new Address();@H_502_6@

address.setId(1);@H_502_6@

address.setProvince("广东省");@H_502_6@

address.setCity("深圳市");@H_502_6@

address.setArea("南山区");@H_502_6@

address.setOther("其它");@H_502_6@

person.setAddress(address);@H_502_6@

JAXB.marshal(person,System.out);@H_502_6@

}@H_502_6@

@H_502_6@

@Test@H_502_6@

publicvoid testUnmarshal1() {@H_502_6@

File xml = new File("D:\\person.xml");@H_502_6@

Person person = JAXB.unmarshal(xml,Person.class);@H_502_6@

System.out.println(person);@H_502_6@

}@H_502_6@

猜你在找的XML相关文章