4.3.2 XStream的使用

XStream是Thoughtworks公司发布的一个开源Java类库,能够实现XML和Java对象之间的转换。XStream的使用非常简单,不需要预先生成相关的辅助类,也不需要依赖于任何映射文件,它还有着很强的扩展功能。在本书中笔者使用的是XStream1.3.1,它的下载地址是http://xstream.codehaus.org/download.html。

下面是一个使用XStream实现XML和Java对象之间相互转换的示例程序。

  1. 1 import com.thoughtworks.xstream.XStream;
  2. 2 import com.thoughtworks.xstream.io.xml.DomDriver;
  3. 3 
  4. 4 /**
  5. 5  * XStream的使用示例
  6. 6  *
  7. 7  * @author liufeng
  8. 8  * @date 2013-09-12
  9. 9  */
  10. 10 public class XStreamTest {
  11. 11  /**
  12. 12  * Java对象转化为XML
  13. 13  *
  14. 14  * @param person Java对象
  15. 15  * @return
  16. 16  */
  17. 17  public static String javaObject2Xml(Person person) {
  18. 18  XStream xs = new XStream(new DomDriver());
  19. 19  // 给Person类定义别名
  20. 20  xs.alias("person", person.getClass());
  21. 21  return xs.toXML(person);
  22. 22  }
  23. 23 
  24. 24  /**
  25. 25  * XML转换为Java对象
  26. 26  *
  27. 27  * @param xml
  28. 28  * @return
  29. 29  */
  30. 30  public static Object xml2JavaObject(String xml) {
  31. 31  XStream xs = new XStream(new DomDriver());
  32. 32  xs.alias("person", Person.class);
  33. 33  Person person = (Person) xs.fromXML(xml);
  34. 34  return person;
  35. 35  }
  36. 36 
  37. 37  public static void main(String[] args) {
  38. 38  // 构建Person对象
  39. 39  Person p1 = new Person();
  40. 40  p1.setName("柳峰");
  41. 41  p1.setSex("男");
  42. 42  p1.setAddress("新疆福海县解乡");
  43. 43  // 将p1对象转换成XML字符串
  44. 44  System.out.println(javaObject2Xml(p1));
  45. 45 
  46. 46  // 构造XML字符串
  47. 47  String xml = "<person><name>路遥</name><sex>男</sex><address>贵州贵阳
  48.    </address></person>";
  49. 48  // 将XML字符串转换成Person对象
  50. 49  Person p2 = (Person) xml2JavaObject(xml);
  51. 50  // 输出:路遥 男 贵州贵阳
  52. 51  System.out.println(p2.getName() + " " + p2.getSex() + " " + p2.getAddress());
  53. 52  }
  54. 53 }
  55. 54 
  56. 55 // 定义Person类
  57. 56 class Person {
  58. 57  private String name;
  59. 58  private String sex;
  60. 59  private String address;
  61. 60 
  62. 61  public String getName() {
  63. 62  return name;
  64. 63  }
  65. 64 
  66. 65  public void setName(String name) {
  67. 66  this.name = name;
  68. 67  }
  69. 68 
  70. 69  public String getSex() {
  71. 70  return sex;
  72. 71  }
  73. 72 
  74. 73  public void setSex(String sex) {
  75. 74  this.sex = sex;
  76. 75  }
  77. 76 
  78. 77  public String getAddress() {
  79. 78  return address;
  80. 79  }
  81. 80 
  82. 81  public void setAddress(String address) {
  83. 82  this.address = address;
  84. 83  }
  85. 84 }

上面程序的运行结果如图4-10所示。

4.3.2 XStream的使用 - 图1

图4-10 XStream示例程序的运行结果

默认情况下,使用XStream转换Java对象得到的XML文档根节点为完整的Java类名。例如,笔者将上面的XStreamTest类放在com.liufeng.course.test包下,在main()方法中将p1对象转换成XML字符串的输出结果应该像下面这样:

  1. <com.liufeng.course.test.Person>
  2. <name>柳峰</name>
  3. <sex></sex>
  4. <address>新疆福海县解乡</address>
  5. </com.liufeng.course.test.Person>

为什么图4-10中的XML根节点是person而不是com.liufeng.course.test.Person呢?这是因为在XStreamTest类的第20行为Person类设置了别名person,如下所示:

  1. xs.alias("person", person.getClass());