您的位置 首页 java

使用jaxb实现Java对象与xml之间的互相转换

Java 中Xml与对象的互转

在java开发中我们经常会遇到Xml与对象互相转换的情况,尤其是针对WebService访问时会涉及到xml与对象的转换问题。目前可以用于xml与对象互转的方式有很多这里采用jdk自带的JAXB来进行。

对于jaxb的介绍我就不用过多的介绍了,网上这方面的资料非常多我这里就是介绍如何利用jaxb来实现java对象与xml彼此之间转换的问题。

我们还是参照代码来进行讲解,代码环境

首先我们看我们有这么一个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

文章来源:智云一二三科技

文章标题:使用jaxb实现Java对象与xml之间的互相转换

文章地址:https://www.zhihuclub.com/184788.shtml

关于作者: 智云科技

热门文章

网站地图