将javaBean转换成XML

来源:互联网 发布:linux 1.6 rpm bin 编辑:程序博客网 时间:2024/05/22 18:54
每次编程遇到困难想要查资料的时候,百度搜索的过程总是让人心累,经常查一个问题就要花去大半天的时间,有些时候还不一定能得到正确的信息。工作了一段时间,大大小小的项目也做过了一些,也遇到了很大大小小的坑。因此我计划将工作中已经成功使用的技术做一个整理,一方面可以给大家提供一些参考。当然啦,也还有一点点私心:便于日后遗忘的时候查阅。

今天要给大家介绍的是如何将javaBean转换成XML。我采用的是JAXB注解的方式。废话不多说,直接上例子。比如我想要组的一个XML格式是这样的:

<country>   <province></province></country>

我应该怎么做呢?

首先你需要写一个Java类。

@XmlRootElementpublic class Country   private String province;      public String getProvince(){       return province;    }   public void setProvince(String province){       this.province = province;   }}

接着再写一个测试的代码

public  static void main(String[ ] args){      Country country = new Country();      country.setProvince("zhejiang");            JAXBContext context = JAXBContext.newInstance(Country.class);      Marshaller marshaller = context.createMarshaller();      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);      StringWriter writer = new StringWriter();      marshaller.marshal(country, writer);      System.out.println(writer.toString());}

输入的结果是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <country>     <province>zhejiang</province>  </coutry></xml>

符合我们的要求。看到这里你应该已经会使用JAXB了。

接下来再跟大家介绍一些高级点的用法。

还是country和province为例子,比如我想要生成这个的一个XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <country>     <province>zhejiang</province>     <province>jiangsu</province>  </coutry></xml>

显然,要实现这样的效果,原先的Country类已经不能完成这个任务了,我们需要对Country类做一点修改,如下所示:

@XmlRootElementpublic class Country{    private List<String> province;    public String getProvince(){       return province;     }    public void setProvince(List<String> province){      this.province = province;    }    public static class Province{           }}

当然了,测试类也要跟着小小地改动一下,如下所示:

public  static void main(String[ ] args){      Country country = new Country();      List<String> province = new ArrayList<String>();      province.add("zhejiang");      province.add("jiangsu");      JAXBContext context = JAXBContext.newInstance(Country.class);      Marshaller marshaller = context.createMarshaller();      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);      StringWriter writer = new StringWriter();      marshaller.marshal(country, writer);      System.out.println(writer.toString());}

改动以后的代码将会得到这样的一个XML。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <country>     <province>zhejiang</province>     <province>jiangsu</province>  </coutry></xml>

结果完全正确。

接着跟大家介绍几个比较常用的注解,它们是@XmlElementWrapper、@XmlElement

我们先来体会一下它是怎么用的,稍后再跟大家介绍它的概念。

产品经理看了我的XML文件后觉得还不错,但是他说还有改进的空间,他想要下面这样的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <country>     <provinceList>        <province>zhejiang</province>        <province>jiangsu</province>     </proviceList>  </coutry></xml>

身为一枚研发,虽然很憎恨产品经理总是改需求,但是仔细想想这个需求也是合理的啊,你想,毕竟province是同一个类型的数据,这个时候为了理解方便,我当然是在这些province外面加上一个provinceList比较合适了。好吧,那我就改改吧。

这个时候我们不需要再改动代码了,只要用一个注解就可以了,用哪个注解呢,就是之前提到过的@XmlElementWrapper。那么问题来了,这个注解要放在那里呢?看下面的代码:

@XmlRootElementpublic class Country{   @XmlElementWrapper    private List<String> province;    public String getProvince(){       return province;     }    public void setProvince(List<String> province){      this.province = province;    }    public static class Province{           }}

看到了吧,就把@XmlElementWrapper放在province属性的上面。

本来想着可以下班了,这时候烦人的产品经理又来了,他说,可能还要麻烦你再改一改,我想要下面这样的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  <country>     <provinceList>        <province-name>zhejiang</province-name>        <province-name>jiangsu</province-name>     </proviceList>  </coutry></xml>

我还有什么话好说呢,改就改吧,不过这是最后一次了,这次改完别再来找我了。其实改下也不难,就只要加一个@XmlElement注解。嘿嘿,就欺负你产品经理不懂技术。

@XmlRootElementpublic class Country{   @XmlElementWrapper    private List<String> province;    @XmlElement(name="province-name")    public String getProvince(){       return province;     }    public void setProvince(List<String> province){      this.province = province;    }    public static class Province{           }}

在getProvince上面加了一个@XmlElement注解,搞定!

最后再简单介绍一下@XmlElementWrapper和@XmlElement这两个注解的概念

@XmlElementWrapper注解表示生成一个包装器元素,仅允许出现在集合属性上。

@XmlElement注解指定一个字段或get/set方法映射到XML的节点,并且可以通过name属性改变java对象属性在XML节点中的名字。