Java通识 -- JAXB组装、解析XML

版权声明:转载原创博客请附上原文链接 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的元素

二:注意事项

  1. 成员同时定义get/set方法后不能将注解定义到属性上,否则会报错生成两个相同节点信息
  2. 使用@XmlAccessOrType注解时若属性值定义为PUBLIC_MEMBER不能实现get/set方法,不然也会报第一个类型错误
  3. 如果属性值为空最后生成的XML不会出现该节点信息
  4. 前四个注解属性都为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>

猜你喜欢

转载自blog.csdn.net/weixin_43495590/article/details/89435572