XML处理利器:XStream
在项目中进行一些类似黑名单、白名单的配置时,需要多个文本文件,很麻烦。本文要通过XStream实现一个XML文件,配置多个功能。本文主要参考《Spring 3.X 企业应用开发实战》第14章内容,加了一下自己的理解,自己的应用。 XStream概述XStream是一套简洁易用的开源框架,用于将java对象序列化为XML文件或者XML文件反序列化为java对象,是java对象和XML相互转换的利器。 XStream框架XStream主要由Converters,IO,Context,Facade四部分组成。 DemoXmlParserTest.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]);
}
}
}
}
设置别名1 设置基本别名 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","userName");
则此时对应的XML为: <?xml version="1.0" encoding="UTF-8"?>
<User>
<id>1</id>
<name>fan</name>
</User>
2 设置高级别名 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","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>88888845</long>
<long>99999</long>
</datas>
</TypeConfig>
</TypeConfigs>
运行结果(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |