首先引入所需的jar:

xstream-1.4.9、xpp3_min-1.1.4c、dom4j-1.6.1,

或用maven管理jar包时在pom.xml中添加:

  1. <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
  2. <dependency>
  3. <groupId>com.thoughtworks.xstream</groupId>
  4. <artifactId>xstream</artifactId>
  5. <version>1.4.9</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/xpp3/xpp3_min -->
  8. <dependency>
  9. <groupId>xpp3</groupId>
  10. <artifactId>xpp3_min</artifactId>
  11. <version>1.1.4c</version>
  12. </dependency>
  13. <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
  14. <dependency>
  15. <groupId>dom4j</groupId>
  16. <artifactId>dom4j</artifactId>
  17. <version>1.6.1</version>
  18. </dependency>

实体类如下:

  1. package com.cn.entity;
  2.  
  3. public class Address {
  4.  
  5. //国
  6. private String country;
  7. //省
  8. private String province;
  9. //市
  10. private String city;
  11. //县
  12. private String county;
  13. //镇
  14. private String town;
  15.  
  16. get...
  17. set...
  18. }
  1. package com.cn.entity;
  2.  
  3. import java.util.List;
  4.  
  5. public class Person {
  6.  
  7. //姓名
  8. private String name;
  9. //性别
  10. private String sex;
  11. //年龄
  12. private int age;
  13. //地址
  14. private List<Address> Address;
  15.  
  16. get...
  17. set...
  18. }

XStream工具类:

  1. package com.cn.util;
  2.  
  3. import com.cn.entity.Address;
  4. import com.cn.entity.Person;
  5. import com.thoughtworks.xstream.XStream;
  6. import com.thoughtworks.xstream.io.xml.DomDriver;
  7. /**
  8. * XStream工具类
  9. * @author sun.kai
  10. * 2016年8月13日
  11. */
  12. public class XStreamUtil {
  13.  
  14. private static XStream xStream;
  15.  
  16. //JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
  17. static{
  18. xStream = new XStream(new DomDriver());
  19. /*
  20. * 使用xStream.alias(String name, Class Type)为任何一个自定义类创建到类到元素的别名
  21. * 如果不使用别名,则生成的标签名为类全名
  22. */
  23. xStream.alias("person", Person.class);
  24. xStream.alias("address", Address.class);
  25. //将某一个类的属性,作为xml头信息的属性,而不是子节点
  26. xStream.useAttributeFor(Address.class, "country");
  27. //对属性取别名
  28. xStream.aliasField("省", Address.class,"province");
  29. }
  30.  
  31. //xml转java对象
  32. public static Object xmlToBean(String xml){
  33. return xStream.fromXML(xml);
  34. }
  35.  
  36. //java对象转xml
  37. public static String beanToXml(Object obj){
  38. return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xStream.toXML(obj);
  39. }
  40. }

测试用例:

  1. package com.test.test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import com.cn.entity.Address;
  7. import com.cn.entity.Person;
  8. import com.cn.util.XStreamUtil;
  9.  
  10. public class TestXStream {
  11.  
  12. public static void main(String[] args) {
  13. long time1 = System.currentTimeMillis();
  14. //测试java对象转xml,java对象中包含集合对象
  15. Person person = new Person();
  16. person.setName("admin管理员");
  17. person.setSex("男");
  18. person.setAge(25);
  19. List<Address> adds = new ArrayList<Address>();
  20. Address address1 = new Address();
  21. address1.setCountry("中国");
  22. address1.setProvince("安徽");
  23. address1.setCity("宿州");
  24. address1.setCounty("萧县");
  25. Address address2 = new Address();
  26. address2.setCountry("中国");
  27. address2.setProvince("上海");
  28. address2.setCity(null);
  29. address2.setCounty("");
  30. adds.add(address1);
  31. adds.add(address2);
  32. person.setAddress(adds);
  33. String xml = XStreamUtil.beanToXml(person);
  34. System.out.println(xml);
  35.  
  36. //测试xml转java对象
  37. Person person2 = (Person) XStreamUtil.xmlToBean(xml);
  38. System.out.println(person2.getAddress().get(1).getProvince());
  39.  
  40. long time2 = System.currentTimeMillis();
  41. System.out.println((time2-time1)+"ms");
  42. }
  43. }

执行后控制台打印:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <person>
  3. <name>admin管理员</name>
  4. <sex></sex>
  5. <age>25</age>
  6. <Address>
  7. <address country="中国">
  8. <省>安徽</省>
  9. <city>宿州</city>
  10. <county>萧县</county>
  11. </address>
  12. <address country="中国">
  13. <省>上海</省>
  14. <county></county>
  15. </address>
  16. </Address>
  17. </person>
  18. 上海
  19. 669ms

总结:

(1) XStream是一个可以将javaBean与XML双向转换的java类库。

(2) Java到xml,使用toXML()方法;xml到Java,用fromXML()方法。

(3) 类别名,用alias(String name, Class type)。

(4) 类成员别名,用aliasField(String alias, Class definedIn, String fieldName)。

(5) 将某一个类的属性,作为xml头信息的属性,而不是子节点,用useAttributeFor(Class definedIn, String fieldName)。

(5) 类成员作为属性别名,用 aliasAttribute(Class definedIn, String attributeName, String alias),单独命名没有意义,还要通过useAttributeFor(Class definedIn, String fieldName) 应用到某个类上。

(6) XStream默认当String类型的属性值为null时不封装到xml中。可以根据实际传xml情况,选择对象属性set空字符串还是null。

XStream轻松转换xml和java对象的更多相关文章

  1. 使用XStream是实现XML与Java对象的转换(6)--持久化

    九.持久化 在第八节的示例中,当我们操作一组对象时,我们可以指定Writer.OutputStream来写出序列化后的XML数据,我们还可以指定Reader.InputStream来读取序列化后的XM ...

  2. 使用XStream是实现XML与Java对象的转换(4)--转换器

    七.转换器(Converter) 我们程序中的POJO是千变万化的,而且需求也是千奇百怪的,所以XStream中的内置的转换器的功能不一定能够满足我们的要求,所以我们就需要自己构建转换器. 1,一个基 ...

  3. 使用XStream是实现XML与Java对象的转换(3)--注解

    六.使用注解(Annotation) 总是使用XStream对象的别名方法和注册转换器,会让人感到非常的乏味,又会产生很多重复性代码,于是我们可以使用注解的方式来配置要序列化的POJO对象. 1,最基 ...

  4. 使用XStream是实现XML与Java对象的转换(2)--别名

    五.使用别名(Alias) 首先,有这样一段Java代码: import java.util.ArrayList; import java.util.List; import com.thoughtw ...

  5. 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例

    一.简单介绍 XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象.Json数据的转换.它不需要schema或其他的mapping文件就可以进行java对象和xml ...

  6. 使用XStream是实现XML与Java对象的转换(5)--Object Stream

    八,Object Stream 之前的例子我们都是直接输出Xml成为String类型或者从String中获得并解析Xml,现在我们要处理输入流和输出流! 1,输出流(ObjectOutputStrea ...

  7. JAXB轻松转换xml对象和java对象

    实体类如下: package com.cn.entity; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; ...

  8. 不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller

    摘要:将XML文档与JAVA对象互转是很常见的需求,如果XML定义很规整这很好实现.然而在现实中“不规矩”的XML可能更常见,Marshaller便无能为力了吗?下面是一个小技巧,调整一下思维便能重用 ...

  9. Java&Xml教程(十一)JAXB实现XML与Java对象转换

    JAXB是Java Architecture for XML Binding的缩写,用于在Java类与XML之间建立映射,能够帮助开发者很方便的將XML和Java对象进行相互转换. 本文以一个简单的例 ...

随机推荐

  1. Python:一些小知识

    小知识点总结 一.Python2与Python3 的区别 1.Python2中可以加括号输出,也可不加输出     Python3中必须加 2.python2 中有xrange(生成器)也有range ...

  2. Jupyter notebook 的一个问题

    Traceback (most recent call last): File , in get value = obj._trait_values[self.name] KeyError: 'all ...

  3. maven 项目运行找不到类

    其实maven 仓库有jar包,可能未编译或破损, 在本地仓删除它,然后maven install

  4. 第12章 GPIO输出—使用固件库点亮LED

    本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 利用库建立好的工程模板,就可以方便地使用STM32 H ...

  5. 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f4-hystrix/ 本文出自方志朋的博客 在微服务架构中, ...

  6. Python 学习笔记(八)Python列表(二)

    列表函数 追加和扩展 list.append() 在列表末尾追加新的对象 >>> dir(list) #dir 查看列表的函数 ['__add__', '__class__', '_ ...

  7. 零基础Python知识点回顾(一)

    如果你是小白,建议只要安装官网的python-3.7.0-amd64.exe 然后在电脑cmd命令提示符  输入检查是否已经安装pip,一般安装了python都会有的. >pip         ...

  8. SpringBoot学习16:springboot整合junit单元测试

    1.创建maven项目,修改pom.xml文件 <!--springboot项目依赖的父项目--> <parent> <groupId>org.springfram ...

  9. SmallMQ发布

    最近一直学习,主要处理java的分布式,MQ,RPC,通信,数据库,缓存等方向. 一般现在的MQ都是企业级的,庞大,功能齐全.最主要是代码量大,对于我们这些小程序员而言,太大,修改困难,修复更加困难, ...

  10. Java程序如何生成Jar 执行文件(2)

    一.用Eclipse生产Jar文件 注意:此方法可以打包含有第三方jar包的项目 1. 首先,右键你的Java工程,选择Export,在Java文件夹下选择Runnable JAR file,如下图所 ...