Java对象和xml文件之间的互相转换

这里提供了一个工具类,可以直接复制用的,使用的是原生的不依赖任何第三方jar包的。转换示例这里也提供了,需要的可以收藏起来!

目录

    • 1、注释说明
      • 1.1、@XmlAccessorType
      • 1.2、@XmlRootElement
      • 1.3、@XmlElement
      • 1.4、@XmlTransient
      • 1.5、@XmlAttribute
      • 1.6、@XmlJavaTypeAdaptor
    • 2、测试类
    • 3、util
    • 4、测试bean在指定路径下生成xml
    • 5、读取指定路径的xml,转为JavaBean

1、注释说明

我们是用的jdk自带的javax.xml包当中提供的方法及主键。
下面这几个注解,是java自带的注解,用来java对象转xml数据使用。

1.1、@XmlAccessorType

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)

可能值:

  • FIELD: JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML,除非由 XmlTransient 注释。
  • NONE: 所有字段或属性都不能绑定到 XML,除非使用一些 JAXB 注释专门对它们进行注释。
  • PROPERTY: JAXB 绑定类中的每个获取方法/设置方法对将会自动绑定到 XML,除非由 XmlTransient 注释。
  • PUBLIC_MEMBER:每个公共获取方法/设置方法对和每个公共字段将会自动绑定到 XML,除非由 XmlTransient 注释。

1.2、@XmlRootElement

xml 文件的根元素

1.3、@XmlElement

代表的生成xml的属性名称,一般用在属性上,或者set方法上。
用法@XmlElement(name=“NewElementName”),那么生成的xml串的elment的标签是NewElementName。
用法示例:

@XmlRootElement(name = "CaseInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class CaseInfo implements Serializable {

    /**
     * 姓名
     */
    @XmlElement(name = "张三")
    private String name;

    public String getName() {
        return name;
    }

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

转为xml之后是:
Java对象和xml文件之间的互相转换_第1张图片

1.4、@XmlTransient

放在属性上,或者set方法上,代表不进行序列化。

1.5、@XmlAttribute

该属性作为xml的attribute。
用法示例:

@XmlRootElement(name = "CaseInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class CaseInfo implements Serializable {

    /**
     * 姓名
     */
    @XmlAttribute(name = "张三")
    private String name;
    
    public String getName() {
        return name;
    }

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

转为xml之后是:
Java对象和xml文件之间的互相转换_第2张图片

1.6、@XmlJavaTypeAdaptor

@XmlRootElement  
@XmlAccessorType(XmlAccessType.PROPERTY)  
public class Boy {  
     
    private String name = "CY";  
  
    private Address address; // 是一个接口  
     
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
}  

在 java object 转换成 xml 的时候,接口Address 无法被转换。
所以 这里要加上 @XmlJavaTypeAdapter(AddressAdapter.class)
所以 要多写一个AddressAdaptor 类。
这个类会返回Address接口的一个具体实现类的对象。

这 就是 @XmlJavaTypeAdapter 的作用。

2、测试类

我们拿这个javaBean来作为测试对象。

@XmlRootElement:代表的生成xml的外标签名称
@XmlElement:代表的生成xml的属性名称

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "CaseInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class CaseInfo{

    /**
     * 姓名
     */
    @XmlElement(name = "NAME")
    private String name;

    /**
     * 性别0男 1女
     */
    @XmlElement(name = "SEX")
    private String sex;

    /**
     * 民族
     */
    @XmlElement(name = "Nation")
    private String nation;

    /**
     * 地址
     */
    @XmlElement(name = "Address")
    private String address;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

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

    public String getNation() {
        return nation;
    }

    public void setNation(String nation) {
        this.nation = nation;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

3、util

import cn.org.entity.CaseInfo;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;


public class XmlUtil {

    /**
     * 读取指定路径的xml文件转换为Java对象
     *
     * @param xmlPath
     * @param load
     * @return
     */
    public static Object xmlToBean(String xmlPath, Class<?> load) {
        JAXBContext context = null;
        Object object = null;
        try {
            context = JAXBContext.newInstance(load);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            object = unmarshaller.unmarshal(new File(xmlPath));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return object;
    }

    /**
     * java对象转换为XML字符串
     *
     * @param obj    Java对象
     * @param load   Java对象类
     * @param coding 编码
     * @return
     * @throws JAXBException
     */
    public static String beanToXml(Object obj, Class<?> load, String coding) {
        JAXBContext context = null;
        StringWriter writer = null;
        try {
            context = JAXBContext.newInstance(load);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, coding);
            writer = new StringWriter();
            marshaller.marshal(obj, writer);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return writer != null ? writer.toString() : null;
    }

    /**
     * java对象转换为XML字符串,并上传到指定路径
     *
     * @param obj     Java对象
     * @param load    Java对象类
     * @param coding  编码
     * @param xmlPath 存放地址
     */
    public static void uploadByBeanToXml(Object obj, Class<?> load, String coding, String xmlPath) {
        String xmlString = beanToXml(obj, load, coding);
        System.out.println(xmlString);
        //写入到xml文件中
        BufferedWriter bfw = null;
        try {
            bfw = new BufferedWriter(new FileWriter(new File(xmlPath)));
            bfw.write(xmlString);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bfw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4、测试bean在指定路径下生成xml

public static void main(String[] args) {
	String url = "C:\\Users\\gxs\\Desktop" + File.separator + "case.xml";
	CaseInfo caseInfo = new CaseInfo();
	caseInfo.setAddress("北京");
	caseInfo.setName("张三");
	// 生成xml文件
	uploadByBeanToXml(caseInfo,CaseInfo.class,"utf-8",url);
}

这时候会发现,假如caseInfo属性值没有赋值,那么生成的xml是连key值也没有的。
在这里插入图片描述
假如想让他在没值的时候,也有key值,可以这样。给属性赋值空值就可以了。这里以Nation属性为例子。

public static void main(String[] args) {
    String url = "C:\\Users\\gxs\\Desktop" + File.separator + "case.xml";
    CaseInfo caseInfo = new CaseInfo();
    caseInfo.setAddress("北京");
    caseInfo.setName("张三");
    caseInfo.setNation("");
    uploadByBeanToXml(caseInfo,CaseInfo.class,"utf-8",url);
}

Java对象和xml文件之间的互相转换_第3张图片

5、读取指定路径的xml,转为JavaBean

public static void main(String[] args) {
    String url = "C:\\Users\\gxs\\Desktop" + File.separator + "case.xml";
    CaseInfo o = (CaseInfo)xmlToBean(url, CaseInfo.class);
    System.out.println(o.getName());
    System.out.println(o.getAddress());
    System.out.println(o.getNation());
}

在这里插入图片描述

你可能感兴趣的:(Java基础,xml,java,开发语言)