XML处理利器:XStream

XML处理利器:XStream在项目中进行一些类似黑名单 白名单的配置时 需要多个文本文件 很麻烦

大家好,欢迎来到IT知识分享网。

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

XStream概述

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

XStream框架

Demo

XmlParserTest.java

package org.fan.test.xstream; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; import java.io.FileInputStream; import java.io.FileNotFoundException; / * Created by fan on 16-1-27. */ public class XmlParserTest { 
    XStream xStream = new XStream(new DomDriver()); TypeConfigList typeConfigList; public static void main(String[] args) { final XmlParser xmlParser = new XmlParser(); xmlParser.xStream.alias("TypeConfigs", TypeConfigList.class); xmlParser.xStream.alias("TypeConfig", TypeConfig.class); //typeConfigList是TypeConfigList.java中的成员变量名 xmlParser.xStream.addImplicitCollection(TypeConfigList.class, "typeConfigList"); xmlParser.readConfigFile(); System.out.println("YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"); } public void readConfigFile() { String path = XmlParser.class.getResource("/").getPath(); FileInputStream pusherInputStream = null; try { pusherInputStream = new FileInputStream(path + "config.xml"); } catch (FileNotFoundException e) { e.printStackTrace(); } typeConfigList = (TypeConfigList) xStream.fromXML(pusherInputStream); for (TypeConfig typeConfig : typeConfigList.getTypeConfigList()) { long[] datas = typeConfig.getDatas(); for (int i = 0; i < datas.length; i++) { System.out.println(datas[i]); } } } } 

设置别名

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

则其对应的XML为:

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

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

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

则此时对应的XML为:

<?xml version="1.0" encoding="UTF-8"?> <User> <id>1</id> <name>fan</name> </User>
package org.fan.test.xstream; / * Created by fan on 16-2-24. */ public class LoginLog { 
    private int logId; private String ip; } 

User.java

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

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

<User> <id>1</id> <name>fan</name> <loginLogs> <loginLog> <id>0</id> <ip>192.168.1.10</ip> </loginLog> <loginLog> <id>1</id> <ip>192.168.1.101</ip> </loginLog> </loginLogs> </User>

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

<User> <id>1</id> <name>fan</name> <loginLog id="0"> <ip>192.168.1.10</ip> </loginLog> <loginLog id="1"> <ip>192.168.1.101</ip> </loginLog> </User>

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

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

配置文件

<?xml version="1.0" encoding="UTF-8"?> <TypeConfigs> <TypeConfig> <type>1</type> <datas> <long>123</long> <long>321</long> <long>44444</long> </datas> </TypeConfig> <TypeConfig> <type>2</type> <datas> <long>7777</long> <long></long> <long>99999</long> </datas> </TypeConfig> </TypeConfigs> 

运行结果

这里写图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/122928.html

(0)
上一篇 2025-10-12 22:26
下一篇 2025-10-12 22:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信