jaxb简介

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。JDK1.6以上自带jaxb,所以不需要像dom4j一样引用第三方依赖

JaxbUtil工具类编写

话不多说,直接上代码,先写一个读写xml的工具类。

/**
 * com.qd.core.util
 *
 * @author liyawei
 * @date 2018/4/24
 */
public class JaxbUtil {

    /**
     * 获取JAXBContext实例
     */
    @SuppressWarnings("unused")
    private static JAXBContext getJAXBContext(Class<?> clazz) {
        JAXBContext jaxbContext = null;
        try {
            jaxbContext = JAXBContext.newInstance(clazz);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return jaxbContext;
    }

    /**
     * 将报文节点反序列化为实体类
     */
    public static Object documentToModel(Object obj, Node node) {
        if (node == null) {
            return null;
        }
        JAXBContext jaxbContext = getJAXBContext(obj.getClass());
        try {
            //得到反序列化实例Unmarshaller
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            obj = unmarshaller.unmarshal(node);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return obj;
    }

    /**
     * 将实体类转序列化为对应String类型xml节点
     */
    public static String modelToStringXML(Object obj) {
        StringWriter writer = new StringWriter();
        JAXBContext jaxbContext = getJAXBContext(obj.getClass());
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();
            //设置序列化的编码格式
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            //设置格式化输出
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(obj, writer);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return writer.toString();
    }

    /**
     * 将实体类转序列化为对应node节点
     */
    public static Node modelToNode(Object obj, Node node) {
        JAXBContext jaxbContext = getJAXBContext(obj.getClass());
        try {
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.marshal(obj, node);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return node;
    }

    /**
     * 将File转化为Document
     */
    public static Document getDocFromStringXml(File file) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document document = null;
        try {
            DocumentBuilder documentBuilder = factory.newDocumentBuilder();
            document = documentBuilder.parse(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return document;
    }
}

序列化(marshal)是指从实体转成xml/节点的过程,而反序列化(unmarshal)是xml/节点转成实体类的过程

实体对象

/**
 * com.qd.core.bean
 *
 * @author liyawei
 * @date 2018/4/24
 */
@XmlRootElement(name = "StudentBean")
public class Student implements Serializable {

    private static final long serialVersionUID = 1L;

    private String id;
    private String name;
    private Integer age;
    private String sex;

    @XmlElement
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @XmlElement
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @XmlElement
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @XmlElement
    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

测试Bean转xml

public class TestBeanToXml {

    public static void main(String[] args) {
        Student student = new Student();
        student.setId("123sadsda");
        student.setName("王小二");
        student.setAge(18);
        student.setSex("男");

        String xml = JaxbUtil.modelToStringXML(student);
        System.out.println(xml);

    }

}

结果如下:

测试xml转Bean

public class TestXmlToBean {

    public static void main(String[] args) {
        File file = new File("student.xml");
        Student student = (Student) JaxbUtil.documentToModel(new Student(), JaxbUtil.getDocFromStringXml(file));
        System.out.println(student);

    }

}

结果如下: