使用Java语言优雅地转换XML
一、概览1. 本文目的: 优雅地处理XML,包括实现XML字符串、文件与Java对象的互相转换。2. 使用条件: 不需要额外引入Jar包,只需要使用JDK1.83. 使用方法: 完成转换只需要完成两个步骤: ① 配置Java对象 ② 调用转换方法二、配置Java对象 只需建立与XML对应的对象实体,再加上几个注解,无论结构多么复杂的XML,都能搞定。...
·
一、概览
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的数据格式,优雅又美观。
更多推荐


所有评论(0)