jaxb简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。JDK1.6以上自带jaxb,所以不需要像dom4j一样引用第三方依赖
JaxbUtil工具类编写
话不多说,直接上代码,先写一个读写xml的工具类。
/**
* com.qd.core.util
*
* @author liyawei
* @date 2018/4/24
*/
public class JaxbUtil {
/**
* 获取JAXBContext实例
*/
@SuppressWarnings("unused")
private static JAXBContext getJAXBContext(Class<?> clazz) {
JAXBContext jaxbContext = null;
try {
jaxbContext = JAXBContext.newInstance(clazz);
} catch (JAXBException e) {
e.printStackTrace();
}
return jaxbContext;
}
/**
* 将报文节点反序列化为实体类
*/
public static Object documentToModel(Object obj, Node node) {
if (node == null) {
return null;
}
JAXBContext jaxbContext = getJAXBContext(obj.getClass());
try {
//得到反序列化实例Unmarshaller
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
obj = unmarshaller.unmarshal(node);
} catch (JAXBException e) {
e.printStackTrace();
}
return obj;
}
/**
* 将实体类转序列化为对应String类型xml节点
*/
public static String modelToStringXML(Object obj) {
StringWriter writer = new StringWriter();
JAXBContext jaxbContext = getJAXBContext(obj.getClass());
try {
Marshaller marshaller = jaxbContext.createMarshaller();
//设置序列化的编码格式
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
//设置格式化输出
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(obj, writer);
} catch (JAXBException e) {
e.printStackTrace();
}
return writer.toString();
}
/**
* 将实体类转序列化为对应node节点
*/
public static Node modelToNode(Object obj, Node node) {
JAXBContext jaxbContext = getJAXBContext(obj.getClass());
try {
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(obj, node);
} catch (JAXBException e) {
e.printStackTrace();
}
return node;
}
/**
* 将File转化为Document
*/
public static Document getDocFromStringXml(File file) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document document = null;
try {
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
document = documentBuilder.parse(file);
} catch (Exception e) {
e.printStackTrace();
}
return document;
}
}
序列化(marshal)是指从实体转成xml/节点的过程,而反序列化(unmarshal)是xml/节点转成实体类的过程
实体对象
/**
* com.qd.core.bean
*
* @author liyawei
* @date 2018/4/24
*/
@XmlRootElement(name = "StudentBean")
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private Integer age;
private String sex;
@XmlElement
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@XmlElement
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试Bean转xml
public class TestBeanToXml {
public static void main(String[] args) {
Student student = new Student();
student.setId("123sadsda");
student.setName("王小二");
student.setAge(18);
student.setSex("男");
String xml = JaxbUtil.modelToStringXML(student);
System.out.println(xml);
}
}
结果如下:
测试xml转Bean
public class TestXmlToBean {
public static void main(String[] args) {
File file = new File("student.xml");
Student student = (Student) JaxbUtil.documentToModel(new Student(), JaxbUtil.getDocFromStringXml(file));
System.out.println(student);
}
}
结果如下: