最近由于规范文件读写,所以需要实现对xml文件进行读取。
本文只是使用commons-configuration2包对xml文件读取。
目前网上介绍的大多都是简单的读取xml文件中的具体字段,甚至官方文档也是简单的进行了介绍。
如果需要直接将xml文件转换成javaBean则需要进行复杂的操作,或者是通过具体的javaBean内进行解析,才能实现。
通过网上搜集资料,发现commons-digester3,能够对javaBean解析。但是,每个对象的解析规则则要进行具体实现。
而本文,通过java的反射机制,实现了通过定义与xml文件对应的javaBean,进行直接转换。
1。首先导入依赖包。如果是maven管理则直接使用如下:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-digester3</artifactId>
<version>3.2</version>
<classifier>with-deps</classifier>
</dependency>
2.具体实现:
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.configuration2.XMLConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;
import org.nutz.json.Json;
/**
* @author zongtao liu</br>
* 2017年4月20日 下午4:37:29</br>
*/
public class XmlFileFactory {
/***
* 将文件加载为文件对应的对象
*
* @param filePath
* @param clazz
* @return
*/
public static <T> T loadFile(String filePath, Class<T> clazz) {
T obj = null;
Parameters params = new Parameters();
FileBasedConfigurationBuilder<XMLConfiguration> builder = new FileBasedConfigurationBuilder<XMLConfiguration>(
XMLConfiguration.class).configure(params.xml().setFileName(filePath));
try {
XMLConfiguration config = builder.getConfiguration();
obj = loadObj(config, "", clazz);
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
/****
* 加载对象
*
* @param config
* @param preProperty
* @param clazz
* @return
* @throws InstantiationException
* @throws IllegalAccessException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
private static <T> T loadObj(XMLConfiguration config, String preProperty, Class<T> clazz)
throws InstantiationException, IllegalAccessException {
T obj = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
int num = 0;
for (Field field : fields) {
field.setAccessible(true); // 设置些属性是可以访问的
String name = field.getName();
String key = preProperty + name;
Class<?> cls = field.getType();
// 如果是枚举类型,直接跳过
if (cls.isEnum()) {
continue;
}
Object configValue = null;
if (isBaseDataType(cls)) {
// 如果是基础数据类型
configValue = config.get(cls, key);
} else if (cls.isArray()) {
// 是否是数组
Class<?> componentType = cls.getComponentType();
if (isBaseDataType(componentType)) {
configValue = config.getArray(componentType, key);
} else