Java 中Xml与对象的互转

你的名字 2022-05-31 10:58 358阅读 0赞

在java开发中我们经常会遇到Xml与对象互相转换的情况,尤其是针对WebService访问时会涉及到xml与对象的转换问题。目前可以用于xml与对象互转的方式有很多这里采用jdk自带的JAXB来进行。
对于jaxb的介绍我就不用过多的介绍了,网上这方面的资料非常多我这里就是介绍如何利用jaxb来实现java对象与xml彼此之间转换的问题。
我们还是参照代码来进行讲解,代码环境

spring boot

首先我们看我们有这么一个xml字符串

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?><user><userid>972a716fcfde4e098fda9bde13f8d31d</userid><username>a001</username><realname>江文轩</realname></user>

那么我们要定义一个类同时这个类中的数据要与xml字符串中的属性进行对应

  1. package com.spring.storeage.entity;
  2. import javax.persistence.*;
  3. import javax.xml.bind.annotation.*;
  4. import java.util.Objects;
  5. /** * com.spring.entity * @author chengjian * 2017/12/23 **/
  6. @Entity
  7. @Table(name = "user", schema = "spring", catalog = "")
  8. @XmlRootElement(name = "user")
  9. @XmlType(propOrder = {
  10. "userid","username","userpwd","realname"})
  11. public class UserEntity {
  12. private String userid;
  13. private String username;
  14. private String userpwd;
  15. private String realname;
  16. @Id
  17. @Column(name = "userid", nullable = false, length = 50)
  18. @XmlElement(name = "userid")
  19. public String getUserid() {
  20. return userid;
  21. }
  22. public void setUserid(String userid) {
  23. this.userid = userid;
  24. }
  25. @Basic
  26. @Column(name = "username", nullable = false, length = 50)
  27. @XmlElement(name = "username")
  28. public String getUsername() {
  29. return username;
  30. }
  31. public void setUsername(String username) {
  32. this.username = username;
  33. }
  34. @Basic
  35. @Column(name = "userpwd", nullable = false, length = 50)
  36. @XmlElement(name = "userpwd")
  37. public String getUserpwd() {
  38. return userpwd;
  39. }
  40. public void setUserpwd(String userpwd) {
  41. this.userpwd = userpwd;
  42. }
  43. @Basic
  44. @Column(name = "realname", nullable = true, length = 200)
  45. @XmlElement(name = "realname")
  46. public String getRealname() {
  47. return realname;
  48. }
  49. public void setRealname(String realname) {
  50. this.realname = realname;
  51. }

在代码中主要有这么些注解

@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属性中
这样我们就完成了实体上的定义,下面我们就看具体的转换方法,很多时候我们都是将转换方法设置为工具类,所以我定义了一个工具类作为转换方法的载体,看下面代码

  1. package com.spring.util;
  2. import javax.xml.bind.JAXBContext;
  3. import javax.xml.bind.JAXBException;
  4. import javax.xml.bind.Marshaller;
  5. import javax.xml.bind.Unmarshaller;
  6. import javax.xml.transform.stream.StreamResult;
  7. import java.io.StringReader;
  8. import java.io.StringWriter;
  9. /** * @author chengjian * xml与实体对象转换工具类 */
  10. public class XmlUtil {
  11. /** * xml字符串转换为实体对象 * @param xml * @param clazz * @return */
  12. public static Object toObject(String xml,Class clazz) {
  13. try {
  14. JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
  15. Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
  16. StringBuffer xmlStr = new StringBuffer( xml );
  17. StringReader reader = new StringReader(xmlStr.toString());
  18. Object obj = unmarshaller.unmarshal(reader);
  19. return obj;
  20. } catch (JAXBException e) {
  21. e.printStackTrace();
  22. return null;
  23. }
  24. }
  25. /** * 实体对象转换为xml字符串 * @param obj * @param clazz * @return */
  26. public static String toXmlString(Object obj,Class clazz) {
  27. String xmlString = "";
  28. try {
  29. JAXBContext context = JAXBContext.newInstance(clazz);
  30. Marshaller marshaller = context.createMarshaller();
  31. StringWriter writer=new StringWriter();
  32. marshaller.marshal(obj,new StreamResult(writer));
  33. xmlString=writer.toString();
  34. } catch (JAXBException e) {
  35. e.printStackTrace();
  36. }
  37. return xmlString;
  38. }
  39. }

上面的代码可以直接进行使用,下面我们编写实际的测试代码

  1. @Test
  2. public void xmlTest(){
  3. Faker faker=new Faker(new Locale("zh-CN"));
  4. //创建实体对象
  5. UserEntity user=new UserEntity();
  6. user.setUserid(CommonUtil.getUuid());
  7. user.setUsername("a001");
  8. user.setRealname(faker.name().fullName());
  9. //将实体对象转换为xml字符串
  10. String xmlString= XmlUtil.toXmlString(user,UserEntity.class);
  11. System.out.println(xmlString);
  12. //创建文件实体
  13. FileEntity fileEntity=new FileEntity();
  14. fileEntity.setFileid(user.getUsername());
  15. fileEntity.setFileext("xml");
  16. fileEntity.setFilename(user.getUsername());
  17. fileEntity.setFiledata(xmlString.getBytes());
  18. //将xml字符串保存到相应的xml文件中
  19. fileSystemStorageService.store(fileEntity);
  20. try {
  21. //测试从xml文件中读取xml字符串
  22. String fileContent=new String(Files.readAllBytes(fileSystemStorageService.load("a001.xml")));
  23. System.out.println("read from file");
  24. System.out.println(fileContent);
  25. //将读取到的xml字符串转化成实体
  26. UserEntity usser1=(UserEntity) XmlUtil.toObject(fileContent,UserEntity.class);
  27. System.out.println(usser1.getUsername());
  28. System.out.println(usser1.getRealname());
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. }

通过上面的代码就能基本完成实体对象与xml之间的互相转换,详细代码参见
spring

发表评论

表情:
评论列表 (有 0 条评论,358人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java Xml对象

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