JAXB实现java对象和xml互相转换
2024-01-31 本文已影响0人
WebGiser
参考
Student.java
package com.test.bean;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Date;
import java.util.List;
@XmlType(propOrder = {"id", "name", "age", "birthday", "father", "teachers", "property"})// 指定序列成的xml节点顺序
@XmlAccessorType(value = XmlAccessType.FIELD) // 访问类型修改为字段
@XmlRootElement
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Student {
@XmlElement
private String id;
@XmlElement
private String name;
@XmlElement
private int age;
@XmlElement
@XmlJavaTypeAdapter(value = DateAdapter.class)
private Date birthday;
@XmlElement
private Father father;
@XmlElement(name = "teacher")
@XmlElementWrapper(name = "teachers")
private List<Teacher> teachers;
@XmlElement
private Property property;
@Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
", father=" + father +
", teachers=" + teachers +
", property=" + property +
'}';
}
}
Father.java
package com.test.bean;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlType(propOrder = {"id", "name", "age"})
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Father {
@XmlElement
private String id;
@XmlElement
private String name;
@XmlElement
private int age;
@Override
public String toString() {
return "Father{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
Property.java
package com.test.bean;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.*;
@XmlAccessorType(value = XmlAccessType.FIELD)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Property {
@XmlAttribute
private String address;
@XmlValue
private String val;
}
Teacher.java(缺少相关注解)
public class Teacher {
@XmlElement
private String name;
@XmlElement
private String sex;
}
DateAdapter.java
package com.test.bean;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateAdapter extends XmlAdapter<String, Date> {
// 反序列化成日期对象Date
public Date unmarshal(String str) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return str == null ? null : format.parse(str);
}
// 序列化成xml
public String marshal(Date date) throws Exception {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return date == null ? null : format.format(date);
}
}
XmlTest.java测试类
package com.test;
import com.test.bean.Father;
import com.test.bean.Property;
import com.test.bean.Student;
import com.test.bean.Teacher;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class XmlTest {
public static void main(String[] args) throws JAXBException {
Father father = Father.builder()
.id("1")
.name("f1")
.age(100)
.build();
List<Teacher> list = new ArrayList<Teacher>();
list.add(new Teacher("t1", "男"));
list.add(new Teacher("t2", "女"));
Property property = Property.builder()
.address("西安市")
.build();
Student student = Student.builder()
.id("1")
.name("张三")
.age(10)
.birthday(new Date())
.father(father)
.teachers(list)
.property(property)
.build();
// 序列化:java -> xml
JAXBContext context = JAXBContext.newInstance(Student.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
StringWriter writer = new StringWriter();
marshaller.marshal(student, writer);
System.out.println(writer.toString());
System.out.println("==========================================================");
// 反序列化:xml -> java
Unmarshaller unmarshaller = context.createUnmarshaller();
File xmlFile = new File("D:\\study\\test\\test.xml");
Student stu = (Student) unmarshaller.unmarshal(xmlFile);
System.out.println(stu.toString());
}
}