一、使用情景
某些时候,我们需要将类转换为xml字符串或者文件进行发送或操作,jdk本身便提供了这样的工具。JAXBContext。
二、使用
代码中注释的很清楚了,就不解释了。主要有两个类:PersonBO是要转换的载体类。Main是测试类。
PersonBOpackage com.example.demo;
import javax.xml.bind.annotation.*;
import java.util.List;
//定义将属性还是get/set映射到xml文件中。如果没有的话会报错,因为默认会既处理属性也处理get/set,会报错提示出现两遍。
@XmlAccessorType(value = XmlAccessType.FIELD)
//xml的root节点的名称
@XmlRootElement(name = "person")
//指定属性在xml文件中的顺序
@XmlType(propOrder = {
"id",
"realName",
"nickName",
"address",
"phoneNum",
"families"
})
public class PersonBO {
public PersonBO() {}
public PersonBO(String desc, Integer id, String realName, String nickName, String address,
String phoneNum, List families) {
this.desc = desc;
this.id = id;
this.realName = realName;
this.nickName = nickName;
this.address = address;
this.phoneNum = phoneNum;
this.families = families;
}
//根节点的属性,例如:
@XmlAttribute(name = "desc")
private String desc;
//xml中的子节点
@XmlElement(name = "real_name", required = true, defaultValue = "no_name")
private String realName;
@XmlElement(name = "id", required = true, defaultValue = "no_id")
private Integer id;
@XmlElement(name = "nick_name")
private String nickName;
@XmlElement(name = "address")
private String address;
@XmlElement(name = "phone_num", required = true)
private String phoneNum;
@XmlList
@XmlElement(name = "family_num")
private List families;
public String getDesc() {
return desc;
}
public PersonBO setDesc(String desc) {
this.desc = desc;
return this;
}
public String getRealName() {
return realName;
}
public PersonBO setRealName(String realName) {
this.realName = realName;
return this;
}
public Integer getId() {
return id;
}
public PersonBO setId(Integer id) {
this.id = id;
return this;
}
public String getNickName() {
return nickName;
}
public PersonBO setNickName(String nickName) {
this.nickName = nickName;
return this;
}
public String getAddress() {
return address;
}
public PersonBO setAddress(String address) {
this.address = address;
return this;
}
public String getPhoneNum() {
return phoneNum;
}
public PersonBO setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
return this;
}
public List getFamilies() {
return families;
}
public PersonBO setFamilies(List families) {
this.families = families;
return this;
}
@Override
public String toString() {
return "PersonBO{" +
"id=" + id +
", realName='" + realName + '\'' +
", nickName='" + nickName + '\'' +
", address='" + address + '\'' +
", phoneNum='" + phoneNum + '\'' +
", families=" + families +
'}';
}
}
Mainpackage com.example.demo;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.*;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author kingboy--KingBoyWorld@163.com
* @date 2017/11/12 下午2:42
* @desc 转换类.
*/
public class Main {
public static void main(String[] args) {
//准备一个实体数据
List families = Stream.of("father", "mother", "sister").collect(Collectors.toList());
PersonBO personBO = new PersonBO("人", 1, "小金", "kingboy",
"北京", "13288888888", families);
//转换
String xml = beanToXml(personBO);
System.out.println(xml);
}
/**
* bean转换为xml,如果转换失败,返回空字符串
* @param object
* @return
*/
public static String beanToXml(Object object) {
try {
//创建操作类
JAXBContext jax = JAXBContext.newInstance(object.getClass());
Marshaller marshaller = jax.createMarshaller();
//解析
StringWriter sw = new StringWriter();
//格式化
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(object, sw);
return sw.toString();
} catch (JAXBException e) {
e.printStackTrace();
}
return "";
}
}