最近有个需求,需要把 bean对象 转成 xml 文件,然后 xml 文件 转成对象 ( 生成 与 解析 ),废话不多说,直接上代码
1. 相关注解详解
// 1. 定义xml中的根属性
@XmlRootElement(name="student")
// 2. 需要解析什么访问权限的javaBean字段 == 如果是私有字段,类上必须加上此注解
@XmlAccessorType(XmlAccessType.FIELD)
// 3. 使用什么标签名包裹该类的全部属性
@XmlRootElement(name="student")
// 4. 该类的属性字段的值需要什么标签进行包裹
@XmlElement(name="name",required = true)
// 5. 属性字段是容器对象如Collection,需要什么标签包裹该字段遍历的元素
@XmlElementWrapper(name = "students")
@XmlElement(name="name") // 遍历的每个JavaBean的属性值由该 定义的标签进行包裹
// 6. 可以迭代容器字段
@XmlAnyElement
// 7. 定义属性字段序列化、反序列化的顺序
@XmlType(propOrder = {"id", "name"})
2. 使用
@Data
@XmlRootElement(name="root") //定义xml中的根属性
@XmlAccessorType(XmlAccessType.FIELD) //定义xml序列化的字段类型
public class School {
//xml属性映射
@XmlElement(name="名称",required = true)
private String name;
@XmlElement(name="数量",required = true)
private Integer count;
}
3. 实现从Bean到xml的转换
public static String beanToXml(School bean) throws JAXBException {
try(ByteArrayOutputStream out = new ByteArrayOutputStream()){
//实参中包含需要解析的类
JAXBContext content = JAXBContext.newInstance(bean);
//javaBean序列化xml文件器
Marshaller marshaller = content.createMarshaller();
//编码
marshaller.setProperty(Marshaller.JAXB_ENCODING,ENCODING);
// 去头
marshaller.setProperty(Marshaller.JAXB_FARGMENT,true);
marshaller.marshal(bean, out);
return out.toString("GBK");
}catch(Exception e){
logger.info("",e);
}
4. 实现从xml到Bean的转换
public static <T> T xmlToJava(String xmlStr,Class<T> tClass) throws Exception{
try(StringReader sr = new StringReader(xmlStr)){
return (T) JAXBContext.newInstance(tClass).createUnmarshaller().unmarshal(sr);
}
}