Java 中Xml与对象的互转

21 篇文章 0 订阅
17 篇文章 1 订阅

在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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用XStream库实现XML对象之间的互转可以通过以下步骤完成: 1. 引入XStream库的依赖:在你的项目引入XStream库的依赖,可以参考我之前提供的Maven和Gradle配置。 2. 定义Java类:创建一个Java类来表示你的对象,并使用XStream提供的注解来指定XML元素和属性与Java类的映射关系。例如: ```java import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("person") public class Person { private String name; private int age; // 省略构造函数、getter和setter方法 // ... } ``` 3. 将对象换为XML:使用XStream将Java对象换为XML字符串。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // 创建一个Person对象 Person person = new Person(); person.setName("John"); person.setAge(30); // 将Person对象换为XML字符串 String xml = xStream.toXML(person); // 输出XML字符串 System.out.println(xml); } } ``` 以上代码将输出以下XML字符串: ```xml <person> <name>John</name> <age>30</age> </person> ``` 4. 将XML换为对象:使用XStream将XML字符串换回Java对象。示例如下: ```java import com.thoughtworks.xstream.XStream; public class Main { public static void main(String[] args) { // 创建XStream实例 XStream xStream = new XStream(); // 设置类别名,用于与XML元素进行映射 xStream.alias("person", Person.class); // XML字符串 String xml = "<person><name>John</name><age>30</age></person>"; // 将XML换为Person对象 Person person = (Person) xStream.fromXML(xml); // 输出Person对象的属性 System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge()); } } ``` 以上代码将输出: ``` Name: John Age: 30 ``` 通过以上步骤,你可以使用XStream实现XML对象之间的互转。你可以根据具体的需求对Java类和XML结构进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值