后续更新JDK10的JAXB的使用
jdk10链接:
JAXB所需要使用到的类
JAXBContext类用于绑定Java实体与XML之间的信息
Marshaller 接口,将Java实体序列化为XML数据.
Unmarshaller接口,将XML数据反序列化为Java对象
JAXB所需要使用的注解
@XmlType,将Java中的变量与Xml中的标签做对应(变量名与Xml中的标签名相同)
@XmlAccessorType
1.@XmlAccessType(XmlAccessorType.FIELD)自动映射类中的属性和xml中的标签,绑定类中每一个非静态的、非瞬态的(@XmlTransien)到XML。注:标签名与变量名要一致.除了指定该变量名的映射关系(如:@XmlElement,@XmlElementWrapper)
@XmlAccessOrder 控制JAXB绑定类中属性和字段的排序
@XmlJavaTypeAdapter 适用定制的适配器(扩展抽象类XmlAdapter覆盖两个序列化方法marshal()和unmarshal()方法),以序列化Java类为Xml
@XmlElementWrapper ,对于数据或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素
@XmlRootElement,指定Xml的根目录为指定类
@XmlElement 将Java类的一个变量映射到与标签同名的一个XML元素
@XmlAttribute 将Java类的一个变量映射到与标签同名的一个XML属性
用到最多的是:
@XmlRootElement
@XmlElement
@XmlElementWrapper
@XmlAccessType(XmlAccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Employee")
@Data
public class Employee {
private Integer id;
private String code;
@XmlElement(name = "gg_name")
private String name;
private String telephone;
private Integer sex;
private Dept dept;
private List depts;
}
注:这里可结合使用lombok注解
效果
1
002
zhangzhang
15698499195
2
7acd2d56-2c77-4ec5-94de-1d0df42195ea
开发部
d9e8cff2-145a-43d5-ae77-8a3989737f47
部门00
43fffeb3-82e1-456a-896e-b6b4220aefbb
部门01
45d1ecea-c5f5-4a39-94ac-71b3a8e124e1
部门02
33a07a23-86b0-4fe3-8d7b-6912921dcd95
部门03
c69057b9-bc9a-44fb-9ffb-9405230c640d
部门04
可以使用@XmlElementWrapper创建更深层的关系
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Employee")
@Data
public class Employee {
private Integer id;
private String code;
@XmlElement(name = "gg_name")
private String name;
private String telephone;
private Integer sex;
private Dept dept;
/**
* @XmlElementWrapper 指定外层Xml的标签名
* @XmlElement 指定集合中的实体的标签名
*/
@XmlElementWrapper(name = "depts")
@XmlElement(name = "dept")
private List depts;
}
效果
1
002
zhangzhang
15698499195
2
e712184d-d6b3-4a7f-bb24-ab002b2c1c51
开发部
f02982da-be9e-41f5-a827-cabf8765d868
部门00
481aded6-ea85-4e8b-a915-35c786ab378e
部门01
9d2205b2-5c25-4610-ac65-f11889a63330
部门02
c06702f1-5b13-4a01-88a4-99b3da355a08
部门03
59ae0a22-8cbf-4f4a-b748-20122a812ccd
部门04
工具类
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class XmlUtil {
/**
* 将对象直接转换成String类型的XML输出
* @param obj 指定对象(包含XML注解)
* @return 返回XML
*/
public static String convertToXml(Object obj) {
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
// 将对象序列化为Xml
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();
}
/**
* 将file类型的xml装换成对象
*/
@SuppressWarnings("unchecked")
public static T convertXmlFileToT(Class clazz,String xmlPath) {
T xmlObject = null;
FileReader fr = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshal = context.createUnmarshaller();
fr = new FileReader(xmlPath);
xmlObject = (T) unmarshal.unmarshal(fr);
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
if(fr != null) {
fr.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return xmlObject;
}
/**
* 将String类型的Xml转换成对象
*/
@SuppressWarnings("unchecked")
public T convertXmlStrToT(Class clazz, String xmlStr) {
T xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = (T) unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
/**
* 根据xml路径将其转为对象
*/
public String convertPathToT(Class clazz, String path) {
JAXBContext context = null;
// 创建输出流
FileWriter fw = null;
try {
context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// 将对象转换成输出流形式的xml
try {
fw = new FileWriter(path);
} catch (Exception e) {
e.printStackTrace();
}
marshaller.marshal(clazz, fw);
} catch (JAXBException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return fw.toString();
}
}
主测试类
public class XmlMain {
@Test
public void test01() {
Employee employee = new Employee();
employee.setId(1);
employee.setCode("002");
employee.setName("zhangzhang");
employee.setSex(2);
employee.setTelephone("15698499195");
Dept dept = new Dept();
dept.setDeptId(UUID.randomUUID().toString());
dept.setDeptName("开发部");
employee.setDept(dept);
List list = new ArrayList<>();
for(int i = 0;i < 5;i++) {
Dept d = new Dept();
d.setDeptId(UUID.randomUUID().toString());
d.setDeptName("部门0" + i);
list.add(d);
}
employee.setDepts(list);
String xml = XmlUtil.convertToXml(employee);
System.out.println(XmlMain.class.getClass().getResource("/employee.xml").getPath());
File file = new File(XmlMain.class.getClass().getResource("/employee.xml").getPath());
OutputStreamWriter osw = null;
try {
FileOutputStream fos = new FileOutputStream(file);
osw = new OutputStreamWriter(fos, "utf-8");
osw.write(xml);
osw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(osw != null) {
osw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void test02() {
Employee employee = XmlUtil.convertXmlFileToT(Employee.class, XmlMain.class.getClass().getResource("/employee.xml").getPath());
List depts = new ArrayList<>();
depts = employee.getDepts();
for(Dept dept : depts) {
System.out.println(dept);
}
System.out.println(employee);
}
}