版权声明:转载原创博客请附上原文链接 https://blog.csdn.net/weixin_43495590/article/details/89435572
一:注解解析
@XmlRootElement : 定义根节点
@XmlElement : 定义节点
@XmlAttribute : 将属性映射为XML属性
@XmlElementWrapper : 为数组/集合定义父节点
@XmlAccessorType : 定义类中需要映射到XML上的属性
1. XmlAccessType.PUBLIC_MEMBER :默认值,public权限亦或是get/set方式访问成员
2. XmlAccessType.FIELD :对象中的所有成员变量
3. XmlAccessType.PROPERTY :对象中所有通过get/set方式访问的成员
4. XmlAccessType.NONE :java对象的所有属性都不映射为xml的元素
二:注意事项
- 成员同时定义get/set方法后不能将注解定义到属性上,否则会报错生成两个相同节点信息
- 使用@XmlAccessOrType注解时若属性值定义为PUBLIC_MEMBER不能实现get/set方法,不然也会报第一个类型错误
- 如果属性值为空最后生成的XML不会出现该节点信息
- 前四个注解属性都为name,用于定义别名。最后一个注解属性value
三:注解节点定义
/**
* @ClassName: TestPojo
* @Description 测试XML转换
* @Author: zsl
* @Data: 2019/4/21 16:32
* @Version 1.0
**/
// 定义为根节点
@XmlRootElement(name = "TEST")
public class TestPojo {
private String mes = "123";
private String name = "测试";
private List<Student> sList;
// 定义XML节点
@XmlElement(name = "MES")
public String getMes() {
return mes;
}
public void setMes(String mes) {
this.mes = mes;
}
// 定义为节点属性
@XmlAttribute(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 定义集合节点
@XmlElementWrapper(name = "SLIST")
@XmlElement(name = "STUDENT")
public List<Student> getsList() {
return sList;
}
public void setsList(List<Student> sList) {
this.sList = sList;
}
}
/**
* @ClassName: Student
* @Description 测试集合节点
* @Author: zsl
* @Data: 2019/4/21 16:51
* @Version 1.0
**/
// 测试@XMLAccessorType注解
@XmlAccessorType(XmlAccessType.FIELD)
public class Student {
public String address = "北京";
public Integer age = 12;
}
三:工具类封装
/**
* @ClassName: XmlUtil
* @Description xml报文组装解析
* @Author: zsl
* @Data: 2019/4/17 19:50
* @Version 1.0
**/
public class XmlUtil {
/**
*@Description:Java对象转换为XML报文工具类
*@Author: zsl
*@Data: 2019/4/18 16:08
*@Param:[obj, load]
*@Return:java.lang.String
**/
public static String beanToXml(Object obj,Class<?> load) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(load);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
StringWriter writer = new StringWriter();
marshaller.marshal(obj,writer);
return writer.toString();
}
/**
*@Description:将String类型的xml报文转换为Java对象
*@Author: zsl
*@Data: 2019/4/19 10:24
*@Param:[repMessage, clazz]
*@Return:T
**/
public static <T> T xmlToBean(String repMessage,Class<T> clazz) throws Exception{
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
// 这个方法具有多种重载、查阅具体API指定
return (T)unmarshaller.unmarshal(new StringReader(repMessage));
}
}
四:测试实例
/**
*@Description:Java对象转XML测试
*@Author: zsl
*@Data: 2019/4/21 17:04
*@Param:[args]
*@Return:void
**/
public static void main(String[] args) throws JAXBException {
TestPojo tp = new TestPojo();
Student s1 = new Student();
Student s2 = new Student();
ArrayList<Student> al = new ArrayList<>();
al.add(s1);
al.add(s2);
tp.setsList(al);
String s = beanToXml(tp, TestPojo.class);
System.out.println(s);
}
<?xml version="1.0" encoding="GBK" standalone="yes"?>
<TEST name="测试">
<MES>123</MES>
<SLIST>
<STUDENT>
<address>北京</address>
<age>12</age>
</STUDENT>
<STUDENT>
<address>北京</address>
<age>12</age>
</STUDENT>
</SLIST>
</TEST>