使用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);
输出结果