JAXBContext实现xml与对象的相互转换

使用jdk自带的类转化对象与xml,不需要引入第三方jar包

1.转化工具类先来一个

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * @author zkh
 * @version 1.0
 * @description
 * @create 2023/10/23 16:32
 */
public class XMLUtils {

    /**
     * xmlString转换成对象
     */
    public static Object convertXmlStrToObject(Class clazz, String xmlStr) throws Exception {
        JAXBContext context = JAXBContext.newInstance(clazz);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        StringReader sr = new StringReader(xmlStr);
        return unmarshaller.unmarshal(sr);
    }

    /**
     * 对象转换成xmlString
     * @return <?xml version="1.0" encoding="UTF-8"?>
     */
    public static String convertToXmlStr(Object obj) throws Exception {
        //创建输出流
        StringWriter sw = new StringWriter();
        sw.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "\n");
        //利用jdk中自带的转换类实现
        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();
        //格式化xml输出的格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        //去掉生成xml的默认报文头
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        //将对象转换成输出流形式的xml
        marshaller.marshal(obj, sw);

        return sw.toString();
    }

    /**
     * 对象转换成xmlString,生成默认的报文头 
     * @return <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     */
    public static String defConvertToXmlStr(Object obj) throws Exception {
        //创建输出流
        StringWriter sw = new StringWriter();
        //利用jdk中自带的转换类实现
        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();
        //格式化xml输出的格式
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        //去掉生成xml的默认报文头
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        //将对象转换成输出流形式的xml
        marshaller.marshal(obj, sw);
        return sw.toString();
    }
}

2.转化xml的对象用到的注解

@XmlRootElement :表示根节点对象,最方便的只用这一个注解就可以转换。

@XmlElement:表示子节点,只能用在属性的get/set方法上。

以上两个可以更改属性在xml输出的字段名,用法:@XmlRootElement(name="别名")

@XmlType:用在根节点类上,主要用于控制类的结构和类型信息,以及属性的顺序等

这三个注解具体可以参考:@XmlType,@XmlRootElement,@XmlAttribute的作用与区别_xmltype注解_鲨鱼辣椒不吃辣c的博客-CSDN博客

3.使用,创建对象

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import java.util.List;


@XmlRootElement(name="school")
@XmlType(propOrder={"schoolName","clazz"})
public class School{

    private String schoolName;
    private List<Clazz> clazz;


    @XmlElement(name = "schoolName")
    public String getSchoolName(){
        return schoolName;
    }

    public void setSchoolName(String schoolName){
        this.schoolName=schoolName;
    }

    @XmlElement(name = "clazz")
    public List<Clazz> getClazz(){
        return clazz;
    }

    public void setClazz(List<Clazz> clazz){
        this.clazz=clazz;
    }

    public static class Clazz{
        private String clazzName;
        private Student student;


        public String getClazzName(){
            return clazzName;
        }

        public void setClazzName(String clazzName){
            this.clazzName=clazzName;
        }


        public Student getStudent(){
            return student;
        }

        public void setStudent(Student student){
            this.student=student;
        }
    }

    public static class Student{

        private String studentName;


        public String getStudentName(){
            return studentName;
        }

        public void setStudentName(String studentName){
            this.studentName=studentName;
        }
    }
}

测试代码

School school=new School();
school.setSchoolName("武汉工程大学");

School.Clazz clazz=new School.Clazz();
clazz.setClazzName("三年二班");

School.Clazz clazz1=new School.Clazz();
clazz1.setClazzName("三年二班1");
List<School.Clazz> clazzes = new ArrayList<>();
clazzes.add(clazz);
clazzes.add(clazz1);
School.Student student=new School.Student();
student.setStudentName("周杰伦");
clazz.setStudent(student);
school.setClazz(clazzes);
String schoolXml= XMLUtils.convertToXmlStr(school);
System.out.println(schoolXml);

输出结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值