每次编程遇到困难想要查资料的时候,百度搜索的过程总是让人心累,经常查一个问题就要花去大半天的时间,有些时候还不一定能得到正确的信息。工作了一段时间,大大小小的项目也做过了一些,也遇到了很大大小小的坑。因此我计划将工作中已经成功使用的技术做一个整理,一方面可以给大家提供一些参考。当然啦,也还有一点点私心:便于日后遗忘的时候查阅。
今天要给大家介绍的是如何将javaBean转换成XML。我采用的是JAXB注解的方式。废话不多说,直接上例子。比如我想要组的一个XML格式是这样的:
<country>
<province></province>
</country>
我应该怎么做呢?
首先你需要写一个Java类。
@XmlRootElement
public 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类做一点修改,如下所示:
@XmlRootElement
public 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。那么问题来了,这个注解要放在那里呢?看下面的代码:
@XmlRootElement
public 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注解。嘿嘿,就欺负你产品经理不懂技术。
@XmlRootElement
public 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节点中的名字。