在java开发中我们经常会遇到Xml与对象互相转换的情况,尤其是针对WebService访问时会涉及到xml与对象的转换问题。目前可以用于xml与对象互转的方式有很多这里采用jdk自带的JAXB来进行。
对于jaxb的介绍我就不用过多的介绍了,网上这方面的资料非常多我这里就是介绍如何利用jaxb来实现java对象与xml彼此之间转换的问题。
我们还是参照代码来进行讲解,代码环境

spring boot

首先我们看我们有这么一个xml字符串

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><userid>972a716fcfde4e098fda9bde13f8d31d</userid><username>a001</username><realname>江文轩</realname></user>

那么我们要定义一个类同时这个类中的数据要与xml字符串中的属性进行对应

package com.spring.storeage.entity;

import javax.persistence.*;
import javax.xml.bind.annotation.*;
import java.util.Objects;

/**
 * com.spring.entity
 * @author chengjian
 * 2017/12/23
 **/
@Entity
@Table(name = "user", schema = "spring", catalog = "")
@XmlRootElement(name = "user")
@XmlType(propOrder = {"userid","username","userpwd","realname"})
public class UserEntity {
    private String userid;
    private String username;
    private String userpwd;
    private String realname;

    @Id
    @Column(name = "userid", nullable = false, length = 50)
    @XmlElement(name = "userid")
    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    @Basic
    @Column(name = "username", nullable = false, length = 50)
    @XmlElement(name = "username")
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "userpwd", nullable = false, length = 50)
    @XmlElement(name = "userpwd")
    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }

    @Basic
    @Column(name = "realname", nullable = true, length = 200)
    @XmlElement(name = "realname")
    public String getRealname() {
        return realname;
    }

    public void setRealname(String realname) {
        this.realname = realname;
    }

在代码中主要有这么些注解

@XmlRootElement(name = “user”) 
 @XmlType(propOrder = {“userid”,”username”,”userpwd”,”realname”}) 
 @XmlElement(name = “userid”)

首先@XmlRootElement(name = “user”)这个注解必须放在类声明上,这说明了我们将这个类定义为可以与xml互相转换,同时生成的xml根元素名称叫user这与前面看到的xml字符串中的内容一致。
然后我们又添加了这么一个注解@XmlType(propOrder = {“userid”,”username”,”userpwd”,”realname”})这个注解我这里标记的是生成的xml字符串中属性的排序,如果不添加propOrder那么生成的xml字符串中各属性将是乱序的。
@XmlElement(name = “userid”)这个注解说明将userid字段映射到生成xml字符串中的useid属性中
这样我们就完成了实体上的定义,下面我们就看具体的转换方法,很多时候我们都是将转换方法设置为工具类,所以我定义了一个工具类作为转换方法的载体,看下面代码

package com.spring.util;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamResult;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * @author chengjian
 * xml与实体对象转换工具类
 */
public class XmlUtil {

    /**
     * xml字符串转换为实体对象
     * @param xml
     * @param clazz
     * @return
     */
    public static Object toObject(String xml,Class clazz) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            StringBuffer xmlStr = new StringBuffer( xml );
            StringReader reader = new StringReader(xmlStr.toString());
            Object obj = unmarshaller.unmarshal(reader);
            return obj;
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 实体对象转换为xml字符串
     * @param obj
     * @param clazz
     * @return
     */
    public static String toXmlString(Object obj,Class clazz) {
        String xmlString = "";
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Marshaller marshaller = context.createMarshaller();
            StringWriter writer=new StringWriter();
            marshaller.marshal(obj,new StreamResult(writer));
            xmlString=writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlString;
    }
}

上面的代码可以直接进行使用,下面我们编写实际的测试代码

@Test
    public void xmlTest(){
        Faker faker=new Faker(new Locale("zh-CN"));
        //创建实体对象
        UserEntity user=new UserEntity();
        user.setUserid(CommonUtil.getUuid());
        user.setUsername("a001");
        user.setRealname(faker.name().fullName());
        //将实体对象转换为xml字符串
        String xmlString= XmlUtil.toXmlString(user,UserEntity.class);
        System.out.println(xmlString);
        //创建文件实体
        FileEntity fileEntity=new FileEntity();
        fileEntity.setFileid(user.getUsername());
        fileEntity.setFileext("xml");
        fileEntity.setFilename(user.getUsername());
        fileEntity.setFiledata(xmlString.getBytes());
        //将xml字符串保存到相应的xml文件中
        fileSystemStorageService.store(fileEntity);
        try {
            //测试从xml文件中读取xml字符串
            String fileContent=new String(Files.readAllBytes(fileSystemStorageService.load("a001.xml")));
            System.out.println("read from file");
            System.out.println(fileContent);
            //将读取到的xml字符串转化成实体
            UserEntity usser1=(UserEntity) XmlUtil.toObject(fileContent,UserEntity.class);
            System.out.println(usser1.getUsername());
            System.out.println(usser1.getRealname());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

通过上面的代码就能基本完成实体对象与xml之间的互相转换,详细代码参见
spring