XML处理利器:XStream
这篇博文参考《Spring 3.X 企业应用开发实战》第14章内容,加了一下自己的理解,自己的应用。 XStream概述XStream是一个简洁的开源框架,可以将java对象序列化为XML或者将XML反序列化java对象。除了java对象与XML之间的相互转换之外,XStream还可以实现java对象与Json之间的相互转换。但是,实际使用中还是使用Jackson框架的比较多。关于Jackson框架以及一个封装好的JacksonUtil源码,详见Jackson框架及JacksonUtil源码(记得之前写过但是现在不知怎么没了,有空补上)。 终于把不懂的东西写完了,终于可以写干货了。 应用XStream解析XML配置文件比方,有一种应用即要配置白名单又要配置黑名单。如白名单用于测试人员各种测试折腾,黑名单用于用户将某好友列为黑名单。配置文件如下: <?xml version="1.0" encoding="UTF-8"?>
<TypeConfigs>
<TypeConfig>
<type>1</type>
<datas>
<long>123</long>
<long>321</long>
</datas>
</TypeConfig>
<TypeConfig>
<type>2</type>
<datas>
<long>7777</long>
<long>888888</long>
<long>999999999</long>
</datas>
</TypeConfig>
</TypeConfigs>
其中type 1表示白名单,type 2表示黑名单。datas表示uid列表。 TypeConfig.java package org.fan.test.xstream;
import java.util.List;
/** * Created by fan on 16-1-18. */
public class TypeConfig {
int type;
//String datas;
long[] datas;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public long[] getDatas() {
return datas;
}
public void setDatas(long[] datas) {
this.datas = datas;
}
}
TypeConfigList.java package org.fan.test.xstream;
import java.util.List;
/** * Created by fan on 16-1-18. */
public class TypeConfigList {
List<TypeConfig> typeConfigList;
public List<TypeConfig> getTypeConfigList() {
return typeConfigList;
}
public void setTypeConfigList(List<TypeConfig> typeConfigList) {
this.typeConfigList = typeConfigList;
}
}
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);
xmlParser.xStream.addImplicitCollection(TypeConfigList.class,"typeConfigList");
//xmlParser.xStream.addImplicitCollection(TypeConfig.class,"datas");
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]);
}
}
}
}
需要解释的几点: XStream xStream = new XStream(new DomDriver());
DomDriver为XML解析引擎,这种方式会将整个XML文档读入到内存造成较大的内存开销。可以使用如下方式,采用XPP(XML Pull Parse)。XPP是一种快速解析XML的解析器。 XStream xStream = new XStream();
2.使用XStream别名 xmlParser.xStream.alias("TypeConfigs",TypeConfigList.class);
xmlParser.xStream.alias("TypeConfig",TypeConfig.class);
如果不是别名,则将java对象转换成XML时,根节点会是完整的类名,阅读起来不够方便、自然。 aliasField(String alias,Class defineIn,String fieldName);
还可以将类中的属性作为XML中的属性存在。这个比较难理解。 aliasAttribute(Class defineIn,String attributeName,String alias);
如,将TypeConfig类中的type当成XML中TypeConfig结点的属性,则可以如下实现: aliasAttribute(TypeConfig.class,"type","typeA");
其中,”type”是TypeConfig类中的属性名,typeA是结点TypeConfig的属性。 useAttributeFor(Class defineIn,String fieldName);
useAttributeFor(TypeConfig.class,"type");
这样在XML中的呈现方式是: <TypeConfig type="1">
3.当类中有list之类的属性时 xmlParser.xStream.addImplicitCollection(TypeConfigList.class,"typeConfigList");
如果没有调用上面的方法(addImplicitCollection,增加隐式集合),则XML中需要这样写: <TypeConfigs>
<typeConfigList>
<TypeConfig>
<type>1</type>
<datas>
<long>123</long>
<long>321</long>
</datas>
</TypeConfig>
<TypeConfig>
<type>2</type>
<datas>
<long>7777</long>
<long>888888</long>
<long>999999999</long>
</datas>
</TypeConfig>
</typeConfigList>
</TypeConfigs>
上面的这个看上去很多余。所以调用addImplicitCollection方法可以使XML更简洁。 //反序列化
fromXML(inputStream);
//序列化
toXML(javaObject,outputStream);
待续1.别名注解 2.XStream四大组件的详解 3.实际开发需求 有时配置文件不可能只配置一次,有可能而且是大多数情况下都是临时加各种配置参数。总不能每次都重启服务,重新读取配置文件吧。因此,如果能每过一段时间就能读取下配置文件就好了,这就是下篇博文要解决的问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- H5音频<audio/>样式修改,拖拽、点击进度操作,总
- objective-c – NSNumber和float – 类型铸造古怪
- ORACLE 11G R2 RAC+Mutilpath+RAW+ASM+Silent+Ad
- c# – 为什么我在asp.net网站启动时收到ThreadAb
- oracle函数 LENGTHC(c1).LENGTH2(c1).LENGTH4(c1
- 通过ajax实现对某个div的整体刷新替换(异步加载
- FastJson过滤字段
- MSHFlexgrid和MSflexgrid控件异同
- React学习笔记(4)---react属性与状态
- Ajax 请求的http头信息特点 x-requested-with