Java 中Xml与对象的互转
在java开发中我们经常会遇到Xml与对象互相转换的情况,尤其是针对WebService访问时会涉及到xml与对象的转换问题。目前可以用于xml与对象互转的方式有很多这里采用jdk自带的JAXB来进行。
对于jaxb的介绍我就不用过多的介绍了,网上这方面的资料非常多我这里就是介绍如何利用jaxb来实现java对象与xml彼此之间转换的问题。
我们还是参照代码来进行讲解,代码环境
spring boot
首先我们看我们有这么一个xml字符串
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><userid>972a716fcfde4e098fda9bde13f8d31d</userid><username>a001</username><realname>江文轩</realname></user>
那么我们要定义一个类同时这个类中的数据要与xml字符串中的属性进行对应
package com.spring.storeage.entity;
import javax.persistence.*;
import javax.xml.bind.annotation.*;
import java.util.Objects;
/** * com.spring.entity * @author chengjian * 2017/12/23 **/
@Entity
@Table(name = "user", schema = "spring", catalog = "")
@XmlRootElement(name = "user")
@XmlType(propOrder = {
"userid","username","userpwd","realname"})
public class UserEntity {
private String userid;
private String username;
private String userpwd;
private String realname;
@Id
@Column(name = "userid", nullable = false, length = 50)
@XmlElement(name = "userid")
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
@Basic
@Column(name = "username", nullable = false, length = 50)
@XmlElement(name = "username")
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Basic
@Column(name = "userpwd", nullable = false, length = 50)
@XmlElement(name = "userpwd")
public String getUserpwd() {
return userpwd;
}
public void setUserpwd(String userpwd) {
this.userpwd = userpwd;
}
@Basic
@Column(name = "realname", nullable = true, length = 200)
@XmlElement(name = "realname")
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
在代码中主要有这么些注解
@XmlRootElement(name = “user”)
@XmlType(propOrder = {“userid”,”username”,”userpwd”,”realname”})
@XmlElement(name = “userid”)
首先@XmlRootElement(name = “user”)这个注解必须放在类声明上,这说明了我们将这个类定义为可以与xml互相转换,同时生成的xml根元素名称叫user这与前面看到的xml字符串中的内容一致。
然后我们又添加了这么一个注解@XmlType(propOrder = {“userid”,”username”,”userpwd”,”realname”})这个注解我这里标记的是生成的xml字符串中属性的排序,如果不添加propOrder那么生成的xml字符串中各属性将是乱序的。
@XmlElement(name = “userid”)这个注解说明将userid字段映射到生成xml字符串中的useid属性中
这样我们就完成了实体上的定义,下面我们就看具体的转换方法,很多时候我们都是将转换方法设置为工具类,所以我定义了一个工具类作为转换方法的载体,看下面代码
package com.spring.util;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamResult;
import java.io.StringReader;
import java.io.StringWriter;
/** * @author chengjian * xml与实体对象转换工具类 */
public class XmlUtil {
/** * xml字符串转换为实体对象 * @param xml * @param clazz * @return */
public static Object toObject(String xml,Class clazz) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringBuffer xmlStr = new StringBuffer( xml );
StringReader reader = new StringReader(xmlStr.toString());
Object obj = unmarshaller.unmarshal(reader);
return obj;
} catch (JAXBException e) {
e.printStackTrace();
return null;
}
}
/** * 实体对象转换为xml字符串 * @param obj * @param clazz * @return */
public static String toXmlString(Object obj,Class clazz) {
String xmlString = "";
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
StringWriter writer=new StringWriter();
marshaller.marshal(obj,new StreamResult(writer));
xmlString=writer.toString();
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlString;
}
}
上面的代码可以直接进行使用,下面我们编写实际的测试代码
@Test
public void xmlTest(){
Faker faker=new Faker(new Locale("zh-CN"));
//创建实体对象
UserEntity user=new UserEntity();
user.setUserid(CommonUtil.getUuid());
user.setUsername("a001");
user.setRealname(faker.name().fullName());
//将实体对象转换为xml字符串
String xmlString= XmlUtil.toXmlString(user,UserEntity.class);
System.out.println(xmlString);
//创建文件实体
FileEntity fileEntity=new FileEntity();
fileEntity.setFileid(user.getUsername());
fileEntity.setFileext("xml");
fileEntity.setFilename(user.getUsername());
fileEntity.setFiledata(xmlString.getBytes());
//将xml字符串保存到相应的xml文件中
fileSystemStorageService.store(fileEntity);
try {
//测试从xml文件中读取xml字符串
String fileContent=new String(Files.readAllBytes(fileSystemStorageService.load("a001.xml")));
System.out.println("read from file");
System.out.println(fileContent);
//将读取到的xml字符串转化成实体
UserEntity usser1=(UserEntity) XmlUtil.toObject(fileContent,UserEntity.class);
System.out.println(usser1.getUsername());
System.out.println(usser1.getRealname());
} catch (IOException e) {
e.printStackTrace();
}
}
通过上面的代码就能基本完成实体对象与xml之间的互相转换,详细代码参见
spring
还没有评论,来说两句吧...