有时候,我们需要把Java对象转换成XML文件。这时可以用JAXB来实现。(JDK1.6及以后的版本无需导入依赖包,因为已经包含在JDK里了)
假如某个公司有许多部门,每个部门有许多职员,我们可以这样来设计简单的bean对象。
@XmlRootElement(name="department")
public class Department {
private String name; //部门名称
private List<Staff> staffs; // 其实staff是单复同型,这里是加's'是为了区别staff
public String getName() {
return name;
}
@XmlAttribute
public void setName(String name) {
this.name = name;
}
public List<Staff> getStaffs() {
return staffs;
}
@XmlElement(name="staff")
public void setStaffs(List<Staff> staffs) {
this.staffs = staffs;
}
}
@XmlRootElement(name="staff")
public class Staff {
private String name; // 职员名称
private int age; // 职员年龄
private boolean smoker; // 是否为烟民
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@XmlElement
public void setAge(int age) {
this.age = age;
}
public boolean isSmoker() {
return smoker;
}
@XmlAttribute
public void setSmoker(boolean smoker) {
this.smoker = smoker;
}
}
下面将生成一个简单的对象,并转换成XML字符串。
public class Main {
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Department.class,Staff.class); // 获取上下文对象
Marshaller marshaller = context.createMarshaller(); // 根据上下文获取marshaller对象
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); // 设置编码字符集
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化XML输出,有分行和缩进
marshaller.marshal(getSimpleDepartment(),System.out); // 打印到控制台
ByteArrayOutputStream baos = new ByteArrayOutputStream();
marshaller.marshal(getSimpleDepartment(), baos);
String xmlObj = new String(baos.toByteArray()); // 生成XML字符串
System.out.println(xmlObj);
}
/**
* 生成一个简单的Department对象
* @return
*/
private static Department getSimpleDepartment() {
List<Staff> staffs = new ArrayList<Staff>();
Staff stf = new Staff();
stf.setName("周杰伦");
stf.setAge(30);
stf.setSmoker(false);
staffs.add(stf);
stf.setName("周笔畅");
stf.setAge(28);
stf.setSmoker(false);
staffs.add(stf);
stf.setName("周星驰");
stf.setAge(40);
stf.setSmoker(true);
staffs.add(stf);
Department dept = new Department();
dept.setName("娱乐圈");
dept.setStaffs(staffs);
return dept;
}
}
控制台打印信息:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<department name="娱乐圈">
<staff smoker="true">
<age>40</age>
<name>周星驰</name>
</staff>
<staff smoker="true">
<age>40</age>
<name>周星驰</name>
</staff>
<staff smoker="true">
<age>40</age>
<name>周星驰</name>
</staff>
</department>
注意到,我们可以用Marshaller.marshal方法将对象转换成xml文件,也可以用UnMarshaller.unmarshal将xml转换成对象。