SpringBoot

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());
    }
}
上一篇 下一篇

猜你喜欢

热点阅读