jaxb2与xml之间相互转换

来源:互联网 发布:我为什么离开华为 知乎 编辑:程序博客网 时间:2024/05/18 22:43

   什么是JAXB
   
Java  Architecture for XML Binding (JAXB)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
   
这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAXDOMJAXB隐藏了细节并且取消了SAXDOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序和Web服务。 

 JAXB2使用了JDK的新特性。如:Annotation、GenericType等,Jaxb2需要在即将转换的JavaBean中添加annotation注解。下面我们就来看看Jaxb2是怎么样完成Java对象到XML之间的相互转换的吧。

@XmlRootElement(name="bean")public class Info implements Serializable {private int id;private String name;private String email;@XmlAttribute(name="num")public int getId() {return id;}public void setId(int id) {this.id = id;}@XmlElementpublic String getName() {return name;}public void setName(String name) {this.name = name;}@XmlElementpublic String getEmail() {return email;}public void setEmail(String email) {this.email = email;}}
@Testpublic void testObject() {Info info = new Info();info.setId(1);info.setName("allan");info.setEmail("tom@tom.com");try {JAXBContext context = JAXBContext.newInstance(Info.class);Marshaller marshal = context.createMarshaller();StringWriter writer = new StringWriter();marshal.marshal(info, writer);System.out.println(writer);Unmarshaller unMarshal = context.createUnmarshaller();StringReader reader = new StringReader(writer.toString());Info content = (Info) unMarshal.unmarshal(reader);System.out.println("ID:" + content.getId() + "\n名字:"+ content.getName() + "\nemail:" + content.getEmail());} catch (JAXBException e) {e.printStackTrace();}}


上面一段是JavaBean和XML的相互转换,传递了一个Info.class,这个Info不是一般的普通的bean。除了它带有getter、setter方法外,还有Annotation注解。

上面的XmlRootElement是设置当前对象转换成xml后的根节点,name的值是设置根节点的名称。在getter方法上设置XmlElement表示这个方法对应的属性是一个xml元素,如果这个注解还设置了name,那么这个name就是转换后xml的名称。在一个属性上设置XmlAttribute,表示这个方法对应的属性在转换xml后是父元素的一个属性。XmlAttribute的name就是转换后xml的属性的name。

 

@XmlRootElement(name="list-beans")public class ListBean {private List<Object> list;private String name;@XmlElements({@XmlElement(name="bean",type=Info.class)})public List<Object> getList() {return list;}public void setList(List<Object> list) {this.list = list;}@XmlAttributepublic String getName() {return name;}public void setName(String name) {this.name = name;}}
@Testpublic void testList() {List<Object> list = new ArrayList<Object>();Info info = new Info();info.setId(1);info.setName("allan");info.setEmail("tom@tom.com");Info info2 = new Info();info2.setId(2);info2.setName("allan2");info2.setEmail("tom2@tom.com");list.add(info);list.add(info2);ListBean listBean = new ListBean();listBean.setName("list to xml");listBean.setList(list);try {JAXBContext context = JAXBContext.newInstance(ListBean.class);Marshaller marshal = context.createMarshaller();StringWriter writer = new StringWriter();marshal.marshal(listBean, writer);System.out.println(writer);Unmarshaller unMarshal = context.createUnmarshaller();StringReader reader = new StringReader(writer.toString());ListBean content = (ListBean) unMarshal.unmarshal(reader);System.out.println(content.getName());} catch (JAXBException e) {e.printStackTrace();}}


上面一段是List和XML的相互转换

XmlElements表示是一个集合类型,然后注解在集合中存放上面类型的对象。

XmlElement表示在集合中存放的一个对象类型和元素名称。

 

@XmlRootElement(name="map-beans")public class MapBean {Map<String,Info> map;@XmlJavaTypeAdapter(MapAdapter.class)public Map<String, Info> getMap() {return map;}public void setMap(Map<String, Info> map) {this.map = map;}}

 

public class MapElement {/*@XmlElementpublic String key;@XmlElementpublic Info value;public MapElement() {}public MapElement(String key, Info value) {super();this.key = key;this.value = value;}*/private String key;private Info value;private MapElement() {}public MapElement(String key, Info value) {super();this.key = key;this.value = value;}@XmlElementpublic String getKey() {return key;}public void setKey(String key) {this.key = key;}@XmlElementpublic Info getValue() {return value;}public void setValue(Info value) {this.value = value;}}


public class MapAdapter extends XmlAdapter<MapElement[],Map<String,Info>>{ @Overridepublic Map<String, Info> unmarshal(MapElement[] param) throws Exception {Map<String, Info> map=new HashMap<String, Info>();for (MapElement element:param) {//map.put(element.key, element.value);map.put(element.getKey(), element.getValue());}return map;}@Overridepublic MapElement[] marshal(Map<String, Info> param) throws Exception {MapElement[] element=new MapElement[param.size()];int i=0;for (Map.Entry<String, Info> entry: param.entrySet()) {element[i++]=new MapElement(entry.getKey(),entry.getValue());}return element;}}

 

@Testpublic void testMap() {MapBean mapBean = new MapBean();Info info = new Info();info.setId(1);info.setName("allan");info.setEmail("tom@tom.com");Info info2 = new Info();info2.setId(2);info2.setName("allan2");info2.setEmail("tom2@tom.com");Map<String, Info> map = new HashMap<String, Info>();map.put("NO1", info);map.put("NO2", info2);mapBean.setMap(map);try {JAXBContext context = JAXBContext.newInstance(MapBean.class);Marshaller marshal = context.createMarshaller();StringWriter writer = new StringWriter();//按照jaxb的格式输出marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshal.marshal(mapBean, writer);System.out.println(writer);Unmarshaller unMarshal = context.createUnmarshaller();StringReader reader = new StringReader(writer.toString());MapBean content = (MapBean) unMarshal.unmarshal(reader);System.out.println(content.getMap().size());} catch (JAXBException e) {e.printStackTrace();}}


上面的map集合的getter方法有一个XmlJavaTypeAdapter,需要传递一个Adapter的类型。

完整代码下载地址:http://download.csdn.net/detail/allan_chan/3931401