XML处理利器:XStream

前端之家收集整理的这篇文章主要介绍了XML处理利器:XStream前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在项目中进行一些类似黑名单、白名单的配置时,需要多个文本文件,很麻烦。本文要通过XStream实现一个XML文件,配置多个功能。本文主要参考《Spring 3.X 企业应用开发实战》第14章内容,加了一下自己的理解,自己的应用。

XStream概述

XStream是一套简洁易用的开源框架,用于将java对象序列化为XML文件或者XML文件反序列化为java对象,是java对象和XML相互转换的利器。

XStream框架

XStream主要由Converters,IO,Context,Facade四部分组成。
1 Converters(转换器)
java对象中有可能有int,float,String,Array,Collection等数据类型的成员变量,这些数据类型如何序列到XML文件中,以及如何从XML文件中反序列化回来,这时就需要Converters。
2 IO(输入输出
文件操作就有IO。XStream通过HierarchicalStreamWriter和HierarchicalStreamReader两个接口实现序列化和反序列化。
3 Context(上下文引用)
XStream在进行序列化和反序列化时会创建两个对象,MarshallingContext(编组上下文,实现java对象到XML)和UnmarshallingContext(反编组上下文,实现XML到java对象),由他们来处理数据并委派给合适的Converters转换器。
4 Facade(统一入口)
XStream通过Facade将上面的3个重要组件集成在一起,以统一的接口开放出来。

Demo

XmlParserTest.java

  1. package org.fan.test.xstream;
  2.  
  3. import com.thoughtworks.xstream.XStream;
  4. import com.thoughtworks.xstream.io.xml.DomDriver;
  5.  
  6. import java.io.FileInputStream;
  7. import java.io.FileNotFoundException;
  8.  
  9.  
  10. /** * Created by fan on 16-1-27. */
  11. public class XmlParserTest {
  12.  
  13. XStream xStream = new XStream(new DomDriver());
  14. TypeConfigList typeConfigList;
  15.  
  16. public static void main(String[] args) {
  17. final XmlParser xmlParser = new XmlParser();
  18.  
  19. xmlParser.xStream.alias("TypeConfigs",TypeConfigList.class);
  20. xmlParser.xStream.alias("TypeConfig",TypeConfig.class);
  21. //typeConfigList是TypeConfigList.java中的成员变量名
  22. xmlParser.xStream.addImplicitCollection(TypeConfigList.class,"typeConfigList");
  23.  
  24. xmlParser.readConfigFile();
  25.  
  26. System.out.println("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY");
  27.  
  28. }
  29.  
  30. public void readConfigFile() {
  31. String path = XmlParser.class.getResource("/").getPath();
  32. FileInputStream pusherInputStream = null;
  33. try {
  34. pusherInputStream = new FileInputStream(path + "config.xml");
  35. } catch (FileNotFoundException e) {
  36. e.printStackTrace();
  37. }
  38. typeConfigList = (TypeConfigList) xStream.fromXML(pusherInputStream);
  39. for (TypeConfig typeConfig : typeConfigList.getTypeConfigList()) {
  40. long[] datas = typeConfig.getDatas();
  41. for (int i = 0; i < datas.length; i++) {
  42. System.out.println(datas[i]);
  43. }
  44. }
  45. }
  46. }

设置别名

1 设置基本别名
在默认情况下,Java对象到XML的映射,java类全名(包括包名)对应XML的根元素名字,java类的属性名对应XML的元素名。例如:
User.java

  1. package org.fan.test.xstream;
  2.  
  3. /** * Created by fan on 16-2-24. */
  4. public class User {
  5. private int userId;
  6. private String userName;
  7. }

则其对应的XML为:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <org.fan.test.xstream.User>
  3. <userId>1</userId>
  4. <userName>fan</userName>
  5. </org.fan.test.xstream.User>

这样很繁琐,可以通过下面的代码简化下:

  1. XStream xStream = new XStream(new DomDriver());
  2. xStream.alias("user",User.class);
  3. xStream.aliasField("id",User.class,"userId");
  4. xStream.aliasField("name","userName");

则此时对应的XML为:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <User>
  3. <id>1</id>
  4. <name>fan</name>
  5. </User>

2 设置高级别名
还有一种别名叫“类成员作为属性别名”,这里的“属性别名”是只XML的属性别名。如下面的例子:
LoginLog.java

  1. package org.fan.test.xstream;
  2.  
  3. /** * Created by fan on 16-2-24. */
  4. public class LoginLog {
  5. private int logId;
  6. private String ip;
  7. }

User.java

  1. package org.fan.test.xstream;
  2.  
  3. import java.util.List;
  4.  
  5. /** * Created by fan on 16-2-24. */
  6. public class User {
  7. private int userId;
  8. private String userName;
  9. private List<LoginLog> logs;
  10. }
  1. XStream xStream = new XStream(new DomDriver());
  2. xStream.alias("user",User.class);
  3. xStream.aliasField("id",User.class,"userId");
  4. xStream.aliasField("name","userName");
  5.  
  6. xStream.alias("loginLog",LoninLog.class);
  7. xStream.aliasField("id",LoginLog.class,"logId");

按照上面的基本别名设置,则对应的XML如下所示:

  1. <User>
  2. <id>1</id>
  3. <name>fan</name>
  4. <loginLogs>
  5. <loginLog>
  6. <id>0</id>
  7. <ip>192.168.1.10</ip>
  8. </loginLog>
  9. <loginLog>
  10. <id>1</id>
  11. <ip>192.168.1.101</ip>
  12. </loginLog>
  13. </loginLogs>
  14. </User>

上面的XML较为繁琐,能否简化成下面的形式呢?

  1. <User>
  2. <id>1</id>
  3. <name>fan</name>
  4. <loginLog id="0">
  5. <ip>192.168.1.10</ip>
  6. </loginLog>
  7. <loginLog id="1">
  8. <ip>192.168.1.101</ip>
  9. </loginLog>
  10. </User>

要实现上面的简化,需要做的是:

  1. //把LoginLog的logId属性视为XML属性
  2. xStream.aliasAttribute(LoginLog.class,"logId","id");
  3. xStream.useAttributeFor(LoginLog.class,"logId");
  4. //隐藏集合类型的XML父节点,即忽略XML中的<logs></logs>标记。其中"logs"是User的属性
  5. xStream.addImplicitCollection(User.class,"logs")

配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <TypeConfigs>
  3. <TypeConfig>
  4. <type>1</type>
  5. <datas>
  6. <long>123</long>
  7. <long>321</long>
  8. <long>44444</long>
  9. </datas>
  10. </TypeConfig>
  11.  
  12. <TypeConfig>
  13. <type>2</type>
  14. <datas>
  15. <long>7777</long>
  16. <long>88888845</long>
  17. <long>99999</long>
  18. </datas>
  19. </TypeConfig>
  20. </TypeConfigs>

运行结果

猜你在找的XML相关文章