Java对象和XML转换

时间:2023-12-09 20:38:31

有时候,我们需要把Java对象转换成XML文件。这时可以用JAXB来实现。(JDK1.6及以后的版本无需导入依赖包,因为已经包含在JDK里了)

假如某个公司有许多部门,每个部门有许多职员,我们可以这样来设计简单的bean对象。

  1. @XmlRootElement(name="department")
  2. public class Department {
  3. private String name;    //部门名称
  4. private List<Staff> staffs;           // 其实staff是单复同型,这里是加's'是为了区别staff
  5. public String getName() {
  6. return name;
  7. }
  8. @XmlAttribute
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. public List<Staff> getStaffs() {
  13. return staffs;
  14. }
  15. @XmlElement(name="staff")
  16. public void setStaffs(List<Staff> staffs) {
  17. this.staffs = staffs;
  18. }
  19. }
  1. @XmlRootElement(name="staff")
  2. public class Staff {
  3. private String name;    // 职员名称
  4. private int age;        // 职员年龄
  5. private boolean smoker; // 是否为烟民
  6. public String getName() {
  7. return name;
  8. }
  9. @XmlElement
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public int getAge() {
  14. return age;
  15. }
  16. @XmlElement
  17. public void setAge(int age) {
  18. this.age = age;
  19. }
  20. public boolean isSmoker() {
  21. return smoker;
  22. }
  23. @XmlAttribute
  24. public void setSmoker(boolean smoker) {
  25. this.smoker = smoker;
  26. }
  27. }

下面将生成一个简单的对象,并转换成XML字符串。

  1. public class Main {
  2. public static void main(String[] args) throws Exception {
  3. JAXBContext context = JAXBContext.newInstance(Department.class,Staff.class);    // 获取上下文对象
  4. Marshaller marshaller = context.createMarshaller(); // 根据上下文获取marshaller对象
  5. marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");  // 设置编码字符集
  6. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化XML输出,有分行和缩进
  7. marshaller.marshal(getSimpleDepartment(),System.out);   // 打印到控制台
  8. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  9. marshaller.marshal(getSimpleDepartment(), baos);
  10. String xmlObj = new String(baos.toByteArray());         // 生成XML字符串
  11. System.out.println(xmlObj);
  12. }
  13. /**
  14. * 生成一个简单的Department对象
  15. * @return
  16. */
  17. private static Department getSimpleDepartment() {
  18. List<Staff> staffs = new ArrayList<Staff>();
  19. Staff stf = new Staff();
  20. stf.setName("周杰伦");
  21. stf.setAge(30);
  22. stf.setSmoker(false);
  23. staffs.add(stf);
  24. stf.setName("周笔畅");
  25. stf.setAge(28);
  26. stf.setSmoker(false);
  27. staffs.add(stf);
  28. stf.setName("周星驰");
  29. stf.setAge(40);
  30. stf.setSmoker(true);
  31. staffs.add(stf);
  32. Department dept = new Department();
  33. dept.setName("娱乐圈");
  34. dept.setStaffs(staffs);
  35. return dept;
  36. }
  37. }

控制台打印信息:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <department name="娱乐圈">
  3. <staff smoker="true">
  4. <age>40</age>
  5. <name>周星驰</name>
  6. </staff>
  7. <staff smoker="true">
  8. <age>40</age>
  9. <name>周星驰</name>
  10. </staff>
  11. <staff smoker="true">
  12. <age>40</age>
  13. <name>周星驰</name>
  14. </staff>
  15. </department>

注意到,我们可以用Marshaller.marshal方法将对象转换成xml文件,也可以用UnMarshaller.unmarshal将xml转换成对象。