Java对象转换成XML

来源:互联网 发布:统计学毕业论文数据 编辑:程序博客网 时间:2024/06/01 08:00

有时候,我们需要把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() { 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
@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;      }  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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

public class Main {      public static void main(String[] args) throws Exception {          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;      }  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

控制台打印信息:

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

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

===============补充理论知识说明========================

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

JDK中JAXB相关的重要Class和Interface:(来源于百度百科JAXB)

JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。 
Marshaller接口,将Java对象序列化为XML数据。 
Unmarshaller接口,将XML数据反序列化为Java对象。 
JDK中JAXB相关的重要Annotation:(来源于百度百科JAXB)

@XmlType,将Java类或枚举类型映射到XML模式类型 
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。 
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。 
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。 
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。 
@XmlRootElement,将Java类或枚举类型映射到XML元素。 
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。 
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。

在以上的注解中,用的最多的是@XMLType,@XmlAccessorType,@XmlRootElement

原创粉丝点击