文章目录
先看一下效果图:
接下来开始操作步骤
:
项目目录结构
先介绍使用到的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一起使用。
-
参数 name
定义XML Schema中type的名称 -
参数 namespace
指定Schema中的命名空间 -
参数 propOrder
指定映射XML时的节点顺序,使用该属性时,必须列出JavaBean对象中的所有字段,否则会报错。 -
参数 factoryClass
指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身 -
参数 factoryMethod
指定工厂类的工厂方法
@XmlAttribute
字段和方法级别的注解。该注解会将字段或get/set方法对应的字段映射成本类对应元素的属性。
-
参数 name
用于指定映射时的节点属性名称(可以指定元素的别名),若不指定,默认使用方法名小写作为元素名。 -
参数 namespace
指定映射时的节点属性命名空间 -
参数 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,我话讲完,谁赞成,谁反对?