使用JAXB方式将java对象转换成xml

  • Post author:
  • Post category:java


先看一下效果图:

在这里插入图片描述


接下来开始操作步骤



图片替换文本



项目目录结构

在这里插入图片描述



先介绍使用到的JAXB作用:



@XmlRootElement

类级别的注解。将类映射为xml全局元素,也就是根元素。



@XmlAccessorType

类级别的注解。定义这个类中的何种类型需要映射到XML。解释起来有点拗口,可以通过它的属性值更好理解这个参数的意义。

  • 参数 value
  • 参数 value 可以接受4个指定值,这几个值是枚举类型,方便调用:

XmlAccessType.FIELD:映射这个类中的所有字段到XML

XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML

XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)

XmlAccessType.NONE:不映射



@XmlType

类级别的注解,常与@XMLRootElement,@XmlAccessorType一起使用。

  1. 参数 name

    定义XML Schema中type的名称

  2. 参数 namespace

    指定Schema中的命名空间

  3. 参数 propOrder

    指定映射XML时的节点顺序,使用该属性时,必须列出JavaBean对象中的所有字段,否则会报错。

  4. 参数 factoryClass

    指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身

  5. 参数 factoryMethod

    指定工厂类的工厂方法



@XmlAttribute

字段和方法级别的注解。该注解会将字段或get/set方法对应的字段映射成本类对应元素的属性。

  1. 参数 name

    用于指定映射时的节点属性名称(可以指定元素的别名),若不指定,默认使用方法名小写作为元素名。

  2. 参数 namespace

    指定映射时的节点属性命名空间

  3. 参数 required

    该属性是否必须,默认为false



@XmlValue



@XmlJavaTypeAdapter

用来标记



创建user类:

package com.example.chang.xml;


import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
// XML文件中的根标识
@XmlRootElement(name = "User")
// 控制JAXB 绑定类中属性和字段的排序
@XmlType(propOrder = {
        "userId",
        "userName",
        "password",
        "birthday",
        "money",
        "computers"
})
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    // 用户Id
    private int userId;

    // 用户名
    @XmlAttribute
    private String userName;
    // 用户密码
    private String password;
    // 用户生日
    private Date birthday;
    // 用户钱包
    private double money;
    // 拥有的电脑
    private List<Computer> computers;

    public User() {
        super();
    }

    public User(int userId, String userName, String password, Date birthday,
                double money) {
        super();
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.birthday = birthday;
        this.money = money;
    }
    //省略一大堆get 和set 
    }



创建工具XMLUtil类:

package com.example.chang.xml;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

/**
 * @Description: 封装了XML转换成object,object转换成XML的代码
 * @Author: 
 * @Date: 2022/1/6
 */
public class XMLUtil {
    /**
     * 将对象直接转换成String类型的 XML输出
     *
     * @param obj
     * @return
     */
    public static String convertToXml(Object obj) {
        // 创建输出流
        StringWriter sw = new StringWriter();
        try {
            // 利用jdk中自带的转换类实现
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            // 格式化xml输出的格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                    Boolean.TRUE);
            // 将对象转换成输出流形式的xml
            marshaller.marshal(obj, sw);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return sw.toString();
    }

    /**
     * 将对象根据路径转换成xml文件
     *
     * @param obj
     * @param path
     * @return
     */
    public static void convertToXml(Object obj, String path) {
        try {
            // 利用jdk中自带的转换类实现
            JAXBContext context = JAXBContext.newInstance(obj.getClass());

            Marshaller marshaller = context.createMarshaller();
            // 格式化xml输出的格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
                    Boolean.TRUE);
            // 将对象转换成输出流形式的xml
            // 创建输出流
            FileWriter fw = null;
            try {
                fw = new FileWriter(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
            marshaller.marshal(obj, fw);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
    /**
     * 将String类型的xml转换成对象
     */
    public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
        Object xmlObject = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            // 进行将Xml转成对象的核心接口
            Unmarshaller unmarshaller = context.createUnmarshaller();
            StringReader sr = new StringReader(xmlStr);
            xmlObject = unmarshaller.unmarshal(sr);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlObject;
    }

    @SuppressWarnings("unchecked")
    /**
     * 将file类型的xml转换成对象
     */
    public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
        Object xmlObject = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            FileReader fr = null;
            try {
                fr = new FileReader(xmlPath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            xmlObject = unmarshaller.unmarshal(fr);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlObject;
    }

}



创建Dog类:

package com.example.chang.xml;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.io.Serializable;


/**
 * @Description:
 * @Author: Chang
 * @Date: 2022/1/6
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Computer")
@XmlType(propOrder = {  "dogName","age" })

public class Dog implements Serializable {
    private static final long serialVersionUID = 1L;
    // 品牌名
    @XmlAttribute///(name="tc")
    private String dogName;
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlValue
    private String age;


    public Dog() {
        super();
    }

    public Dog( String brandName,String age) {
        super();
        this.dogName = brandName;
        this.age = age;

    }
     //省略一大堆get 和set 
    }



创建Computer类:

package com.example.chang.xml;


import java.io.Serializable;
import java.util.Date;

import javax.xml.bind.annotation.*;

/**
 * @Description: 电脑的类
 * @Author: 
 * @Date: 2022/1/6
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Computer")
@XmlType(propOrder = { "tc","serialNumber", "brandName",  "price","productDate","dog" })
public class Computer implements Serializable {
    private static final long serialVersionUID = 1L;

    @XmlAttribute
    private String tc;
    // 序列号
    private String serialNumber;
    // 品牌名

    private String brandName;
    // 生成日期
    private Date productDate;
    // 价格
    private double price;
    private Dog dog;

    public Computer() {
        super();
    }

    public Computer(String tc,String serialNumber, String brandName, Date productDate,
                    double price,Dog dog) {
        super();
        this.tc = tc;
        this.serialNumber = serialNumber;
        this.brandName = brandName;
        this.productDate = productDate;
        this.price = price;
        this.dog = dog;
    }
     //省略一大堆get 和set 
     }



创建测试Test类:

package com.example.chang.xml;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * @Description: 测试
 * @Author: 
 * @Date: 2022/1/6
 */
public class Test {
    public static void main(String[] args) {
        User user = new User(1, "张三", "zhang123", new Date(), 1088.0);
        List<Computer> list = new ArrayList<Computer>();
        list.add(new Computer("2","李四", "lisi666", new Date(), 445,new Dog("myDog","6")));
        list.add(new Computer("3","王五", "wangwu888", new Date(), 666,new Dog("yourDog","18")));
        user.setComputers(list);
        String path = "D:\\user.xml";
        System.out.println("将对象转换成File类型的xml Start---");
        XMLUtil.convertToXml(user, path);
        System.out.println("将对象转换成File类型的xml End---");
        System.out.println();
        System.out.println("将File类型的xml转换成对象 Start---");
        User user2 = (User) XMLUtil.convertXmlFileToObject(User.class, path);
        System.out.println(user2);
        System.out.println("将File类型的xml转换成对象 End---");

    }
}



运行效果图:

在这里插入图片描述

ok,我话讲完,谁赞成,谁反对?

图片替换文本



版权声明:本文为qidaihuimou原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。