说明
JAXB(Java Architecture for XML Binding)
是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档
@XmlRootElement
用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称@XmlAccessorType
定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType
,默认使用XmlAccessType.PUBLIC_MEMBER
注解)
XmlAccessType.FIELD
: java对象中的所有成员变量。
XmlAccessType.PROPERTY
:java对象中所有通过getter/setter方式访问的成员变量。
XmlAccessType.PUBLIC_MEMBER
:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量。
XmlAccessType.NONE
: java对象的所有属性都不映射为xml的元素@XmlAttribute
用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名@XmlElement
指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称@XmlJavaTypeAdapter
使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XMLMarshaller
接口,将Java对象序列化为XML数据Unmarshaller
接口,将XML数据反序列化为Java对象
流程
- 创建xml对应的实体类
- 日期类型处理
@XmlJavaTypeAdapter
代码
xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<ZhbitEventResult xmlns="http://com.zhbit.schema/EventMessage.xsd">
<Event>
<studentNumber>170202041011</vesseGID>
<ServiceType>zhbit</ServiceType>
<ChineseName>张三</ChineseName>
</Event>
<Event>
<studentNumber>170202041012</vesseGID>
<ServiceType>zhbit</ServiceType>
<ChineseName>李四</ChineseName>
</Event>
<updateTimeUTC>2020-07-03 07:30:00</updateTimeUTC>
</ZhbitEventResult>
xml实体类映射
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import lombok.Data;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "ZhbitEventResult")
public class ZhbitEventResult implements Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(name = "Event")
private List<Event> events;
@XmlElement(name = "updateTimeUTC")
@XmlJavaTypeAdapter(JaxbDateSerializer.class)
private Date updateTimeUTC;
}
import java.io.Serializable;
import java.util.Date;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import lombok.Data;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Event")
public class Event implements Serializable {
private static final long serialVersionUID = 1L;
@XmlElement(name = "studentNumber")
private String studentNumber;
@XmlElement(name = "ServiceType")
private String serviceType;
@XmlElement(name = "ChineseName")
private String ChineseName;
}
日期格式处理
: xml是文本类型数据,时间类型的数据在xml中只是字符串, 转成Bean的过程中,需要自定义适配器, 若只想保持字符串格式,可省略此步
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.xml.bind.annotation.adapters.XmlAdapter;
/**
*/
public class JaxbDateSerializer extends XmlAdapter<String, Date> {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
private static class SingletonDateFormat {
private static final SimpleDateFormat instance = new SimpleDateFormat(DATE_FORMAT);
}
public static SimpleDateFormat getSimpleDateFormat() {
return SingletonDateFormat.instance;
}
@Override
public Date unmarshal(String v) throws Exception {
SimpleDateFormat format = getSimpleDateFormat();
return format.parse(v);
}
@Override
public String marshal(Date v) throws Exception {
SimpleDateFormat format = getSimpleDateFormat();
return format.format(v);
}
}
xml文本转JavaBean工具类
public static<T> T xml2bean(String xml, Class<T> beanClazz) {
T t = null;
try {
JAXBContext context = JAXBContext.newInstance(beanClazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader reader = new StringReader(xml);
SAXParserFactory sax = SAXParserFactory.newInstance();
sax.setNamespaceAware(false); // 忽略命名空间
XMLReader xmlReader = sax.newSAXParser().getXMLReader();
Source source = new SAXSource(xmlReader, new InputSource(reader));
t = (T) unmarshaller.unmarshal(source);
} catch (Exception e) {
logger.error(ExceptionTool.getTrace(e));
}
return t;
}