龙空技术网

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

java程序人生 69

前言:

眼前小伙伴们对“jaxb解析xml”可能比较关心,朋友们都需要分析一些“jaxb解析xml”的相关文章。那么小编同时在网上汇集了一些对于“jaxb解析xml””的相关资讯,希望我们能喜欢,大家一起来学习一下吧!

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

标签: #jaxb解析xml #jaxb解析带命名空间的xml