使用XStream进行Xml字符串和Entity中相互转换

虽然目前绝大多数情况传递参数都是使用JSON进行传递,但是也不排除存在XML的可能性,今天带来一个使用XStream进行对XML字符串和Entity之间的相互转换,希望可以帮到大家。
基于环境(关键):Maven

  • 1:首先加入相关依赖
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.11.1</version>
        </dependency>
  • 2:创建需要转换的实体类
//lombok插件
@Data
//该代码是指的是根节点的名称 如果不指定 就会默认是 yq.entity.XML.TestXmlEntity 完整名
@XStreamAlias("testXmlEntity")
public class TestXmlEntity {

    //该属性就当做 xml中的属性使用  该注解就是当做属性实行
    @XStreamAsAttribute
    private String id;
    //这就是xml中的子节点
    private List<TestXmlEntityChildren> testXmlEntityChildrens;
}

@Data
//设置属性的别名
@XStreamAlias("testXmlEntityChildren")
public class TestXmlEntityChildren {
    private String name;
    private String age;
    private String sex;
}

  • 3:创建测试类进行测试
public class Test {

    private static XStream xStream = null;

    public static void main(String[] args) {\
    	//创建一些测试数据
        TestXmlEntityChildren zhangsan = new TestXmlEntityChildren("张三","18","男");
        TestXmlEntityChildren xiaohong = new TestXmlEntityChildren("小红","18","女");
        List<TestXmlEntityChildren> testXmlEntityChildrens = new ArrayList<>();
        testXmlEntityChildrens.add(zhangsan);
        testXmlEntityChildrens.add(xiaohong);
        TestXmlEntity testXmlEntity = new TestXmlEntity(IdUtil.createId(),testXmlEntityChildrens);
        //调用方法转换为String
        String s = entityToString(testXmlEntity);
        System.out.println(s);
        //调用方法转换为Entity
        TestXmlEntity o = (TestXmlEntity) xmlStrToEntity(s);
        System.out.println(o.toString());
    }

    //实体类转换为xml
    public static String entityToString(Object object){
        initXStream();
        //得到转换的字符串
        String xmlStr = xStream.toXML(object);
        //因为字符串中的下划线是两个下划线 所以转换的时候就需要替换下,如果字段里面没下划线那就不需要
        //String replace = xmlStr.replace("__", "_");
        return xmlStr;
    }

    //xml转换为实体类
    public static Object xmlStrToEntity(String xmlStr){
        initXStream();
        Object obj = xStream.fromXML(xmlStr);
        return obj;
    }

    //初始化XStream
    public static void initXStream(){
        if(xStream == null){
            xStream = new XStream();
            //支持需要转换类中的注解
            xStream.autodetectAnnotations(true);
            //需要转换的所有类
            Class[] classs = {TestXmlEntity.class, TestXmlEntityChildren.class};
            xStream.processAnnotations(classs);
            //这是单个赋值方法
            //xStream.processAnnotations(TestXmlEntity.class);
        }
    }
}


//最后程序的运行结果为:
<testXmlEntity id="6363667337216">
  <item>
    <testXmlEntityChildren>
      <name>张三</name>
      <age>18</age>
      <sex>男</sex>
    </testXmlEntityChildren>
    <testXmlEntityChildren>
      <name>小红</name>
      <age>18</age>
      <sex>女</sex>
    </testXmlEntityChildren>
  </item>
</testXmlEntity>
=================分割线 下面是转换为entity=================
TestXmlEntity(id=6363667337216, testXmlEntityChildrens=[TestXmlEntityChildren(name=张三, age=18, sex=男), TestXmlEntityChildren(name=小红, age=18, sex=女)])

问题:那就是生成的xml中如果存在字段下面还存在字段这种(我们这里的List)虽然我们可以区别名,但是无法抹去,下面这种方法可以替换掉,但是在逆向转换为entity的时候就无法转换,所以还是要根据情况使用,如果哪位大佬可以解决这个问题,麻烦指出,谢谢。
xmlStr.replace("","");
xmlStr.replace("","");

发布了25 篇原创文章 · 获赞 9 · 访问量 3068

猜你喜欢

转载自blog.csdn.net/qq_40053836/article/details/95981892