1 JAXB实现对象与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属性定义这个根节点的名称。
-
@XmlElementWrapper,为数组或集合定义一个父节点。通过name属性定义这个父节点的名称。
2 maven引入 jaxb-api.x.x 的依赖
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
3 例子如下
3.1 user和company实体类
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="user")
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String password;
@XmlAttribute(name="id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement(name="username")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@XmlElement(name="password")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
// ----------------------分割线------------------------------
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="company")
public class Company implements Serializable{
private static final long serialVersionUID = 1L;
private List<User> uList = new ArrayList<>();
private int cid;
private String companyName;
@XmlAttribute(name="cid")
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
@XmlElement(name="companyName")
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
@XmlElementWrapper(name="uList")
@XmlElement(name="user")
public List<User> getuList() {
return uList;
}
public void setuList(List<User> uList) {
this.uList = uList;
}
@Override
public String toString() {
return "Company [uList=" + uList + ", cid=" + cid + ", companyName=" + companyName + "]";
}
}
3.2 jaxbutil 工具类
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;
import com.sun.xml.internal.ws.util.StringUtils;
public class JaxbUtil {
// 多线程安全的Context.
private JAXBContext jaxbContext;
/**
* @param types 所有需要序列化的Root对象的类型.
*/
public JaxbUtil(Class<?>... types) {
try {
jaxbContext = JAXBContext.newInstance(types);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
/**
* xml文件配置转换为对象
* @param xmlPath xml文件路径
* @param load java对象.Class
* @return java对象
* @throws JAXBException
* @throws IOException
*/
public Object xmlToBean(String xmlPath,Class<?> clazz) throws JAXBException, IOException{
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object object = unmarshaller.unmarshal(new File(xmlPath));
return object;
}
/**
* Java Object->Xml.
*/
public String toXml(Object root, String encoding) {
try {
StringWriter writer = new StringWriter();
createMarshaller(encoding).marshal(root, writer);
return writer.toString();
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
/**
* Java Object->Xml, 特别支持对Root Element是Collection的情形.
*/
public String toXml(Collection root, String rootName, String encoding) {
try {
CollectionWrapper wrapper = new CollectionWrapper();
wrapper.collection = root;
JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(
new QName(rootName), CollectionWrapper.class, wrapper);
StringWriter writer = new StringWriter();
createMarshaller(encoding).marshal(wrapperElement, writer);
return writer.toString();
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
/**
* Xml->Java Object.
*/
@SuppressWarnings("unchecked")
public <T> T fromXml(String xml) {
try {
StringReader reader = new StringReader(xml);
return (T) createUnmarshaller().unmarshal(reader);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
/**
* Xml->Java Object, 支持大小写敏感或不敏感.
*/
@SuppressWarnings("unchecked")
public <T> T fromXml(String xml, boolean caseSensitive) {
try {
String fromXml = xml;
if (!caseSensitive)
fromXml = xml.toLowerCase();
StringReader reader = new StringReader(fromXml);
return (T) createUnmarshaller().unmarshal(reader);
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
/**
* 创建Marshaller, 设定encoding(可为Null).
*/
public Marshaller createMarshaller(String encoding) {
try {
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
if(null != encoding && !"".equals(encoding)){
// if (StringUtils.(encoding)) {
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
}
return marshaller;
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
/**
* 创建UnMarshaller.
*/
public Unmarshaller createUnmarshaller() {
try {
return jaxbContext.createUnmarshaller();
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
/**
* 封装Root Element 是 Collection的情况.
*/
public static class CollectionWrapper {
@XmlAnyElement
protected Collection collection;
}
}
测试
public class UserTest {
public static void main(String[] args) throws JAXBException, IOException {
List<User> userList = new ArrayList<>();
for (int i=0;i<5;i++) {
User user = new User();
user.setId(1);
user.setUsername("卡子锅锅"+1);
user.setPassword("123"+1);
userList.add(user);
}
Company cm = new Company();
cm.setCid(1);
cm.setCompanyName("还是威");
cm.setuList(userList);
//将java对象转换为XML字符串
JaxbUtil requestBinder = new JaxbUtil(Company.class,
CollectionWrapper.class);
String retXml = requestBinder.toXml(cm, "utf-8");
System.out.println("xml:"+retXml);
//写入到xml文件中
String xmlPath = "C:\\Users\\liping\\Desktop\\na\\userlist2.xml";
BufferedWriter bfw = new BufferedWriter(new FileWriter(new File(xmlPath)));
bfw.write(retXml);
bfw.close();
System.out.println("+++++++++++++++++++++++++++++");
//将xml字符串转换为java对象
JaxbUtil resultBinder = new JaxbUtil(Company.class,
CollectionWrapper.class);
Company hotelObj = resultBinder.fromXml(retXml);
System.out.println("hotelObj:"+hotelObj);
Object object = resultBinder.xmlToBean("C:\\Users\\liping\\Desktop\\na\\userlist.xml",Company.class);
Company company = (Company)object;
List<User> studentList = company.getuList();
System.out.println("-------company>:"+company);
System.out.println("-------studentList>:"+studentList);
}
}