一、概览

1. 本文目的:

   优雅地处理XML,包括实现XML字符串、文件与Java对象的互相转换。

2. 使用条件:

   不需要额外引入Jar包,只需要使用JDK1.8

3. 使用方法:

   完成转换只需要完成两个步骤:
   ① 配置Java对象
   ② 调用转换方法

二、配置Java对象

   只需建立与XML对应的对象实体,再加上几个注解,无论结构多么复杂的XML,都能搞定。


举例说明:
XML如下:

<user>
	<name>迪巴拉</name>
	<age>26</age>
	<company type="SerieA">
    	<name>尤文图斯</name>
    </company>
    <nation type="SouthAmerica">阿根廷</nation>
</user>

Java对象:

/**
 * Created by WangXJ
 * 2019/12/17 17:04
 */
@Data// lombok注解,给字段添加getter和setter
@XmlAccessorType(XmlAccessType.FIELD)// 映射所有的字段
@XmlRootElement(name = "user")// XML根节点名称,此处为user
public class User {

    private String name;

    private String age;

    private Company company;

    private Nation nation;
}
/**
 * Created by WangXJ
 * 2019/12/17 17:09
 */
@Data// lombok注解,给字段添加getter和setter
@XmlAccessorType(XmlAccessType.FIELD)// 映射所有的字段
@XmlRootElement(name = "company")// XML根节点名称,此处为company
public class Company {

    @XmlAttribute// 解析节点的属性
    private String type;

    // 解析子节点的内容
    private String name;
}
/**
 * Created by WangXJ
 * 2019/12/17 17:17
 */
@Data// lombok注解,给字段添加getter和setter
@XmlAccessorType(XmlAccessType.FIELD)// 映射所有的字段
@XmlRootElement(name = "nation")// XML根节点名称,此处为nation
public class Nation {

    @XmlAttribute// 解析节点的属性
    private String type;

    @XmlValue// 解析nation节点的内容,字段名称无所谓
    private String nationValue;
}

三、XML转换

1. Java对象转XML字符串:
public static String convertToXml(Object obj) {
		// 创建输出流
		StringWriter sw = new StringWriter();
		try {
			// 利用jdk中自带的转换类实现
			JAXBContext context = JAXBContext.newInstance(obj.getClass());

			Marshaller marshaller = context.createMarshaller();
			// 格式化xml输出格式,并去除 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
			marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
			// 格式化xml输出的格式
			//marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
			// 将对象转换成输出流形式的xml
			marshaller.marshal(obj, sw);
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		return sw.toString();
	}
2. 将String类型的xml转换成Java对象:
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) {
			logger.info("--convertXmlStrToObject-- Class={} , xmlStr={},异常 \n {}",clazz.getClass(),xmlStr,e);
//			e.printStackTrace();
		}
		return xmlObject;
	}

在IDEA中debug效果如下:
在这里插入图片描述

3. 将对象根据路径转换成xml文件:
/**
	 * 将对象根据路径转换成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();
		}
	}
4. 将file类型的xml转换成对象:
/**
	 * 将file类型的xml转换成对象
	 */
	public static Object convertXmlFileToObject(@SuppressWarnings("rawtypes") 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;
	}
}

四、小结

之前使用过dom4j的方式转换XML,麻烦,效率低,而且不优雅,使用JAXB方式确实简洁了很多。但是,有条件还是建议使用Json的数据格式,优雅又美观。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐