码迷,mamicode.com
首页 > 移动开发 > 详细

Android中Xml工具类的封装

时间:2015-11-14 22:01:06      阅读:806      评论:0      收藏:0      [点我收藏+]

标签:

  Android中经常使用到操作XML,其中有一对XmlSerializer和XmlPullParser封装的很好,可是操作起来很复杂,虽然不难,但是感觉做了一点小事却写了一大堆的代码。有点烦,因此封装一下。

  其思路为:根据传入的数据,获取字节码后进行反射解析,然后在存储。思路很简单,此demo只写了一个基本的List<T>类型的,其它类型道理与此大同小异,就当这个是抛砖引玉了。

  对于一些Model可能有些字段是不需要序列化的,这里可以使用注解来操作

/**
 * XML操作工具类
 * @author chenhao24
 *
 */
public class XMLUtils{
    
    /**
     * 持久化数据到本地xml
     * @param path
     * @param data
     * @throws Exception
     */
    public static void serializerData(String path,List<?> data) throws Exception{
        
        if(data == null || path == null || TextUtils.isEmpty(path) || data.isEmpty()){
            return;
        }
        
        File destFile = new File(path);
        
        if(destFile.exists()){
            destFile.delete();
            destFile.createNewFile();
        }
        
        Map<String, Method> mdatas = new HashMap<String, Method>();
        
        String className = parseFields(data,mdatas);
        
        parseData(mdatas,data,destFile,className);
    }

    /**
     * 获取字节码并解析出字段和该字段对应的get方法
     * @param data
     * @param mdatas
     * @return
     */
    private static String parseFields(List<?> data,Map<String, Method> mdatas) {
        
        Class<?> clazz = data.get(0).getClass();
        
        Field[] fields = clazz.getDeclaredFields();

        Method[] methods = clazz.getMethods();
        
        for (Field field : fields) {
            String fieldName = field.getName().toLowerCase(Locale.ENGLISH);
            for (Method method : methods) {
                //转小写
                String methodName = method.getName().toLowerCase(Locale.ENGLISH);
                
                // 根据 field和get匹配
                if (methodName.startsWith("get")
                        && methodName.endsWith(fieldName)) {
                    mdatas.put(fieldName, method);
                } else {
                    continue;
                }
            }
        }
        
        // 获取 类名
        String clazzName = clazz.getName();

        return clazzName.substring(clazzName.lastIndexOf(".") + 1).toLowerCase(Locale.ENGLISH);
    }
    
    /**
     * 对数据进行解析并存储到xml中
     * 这个方法写的不好,解析类和操作XML的代码混合在一起
     * 而且还有个 双重循环。暂时先不处理
     * @param mdatas
     * @param data
     * @param destFile
     * @param clazzName
     * @throws Exception
     */
    private static void parseData(Map<String, Method> mdatas,List<?> data,File destFile,String clazzName) throws Exception{
        
        // 此处进行存储
        XmlSerializer xmlCreater = Xml.newSerializer();
        
        FileOutputStream outputStream = new FileOutputStream(destFile);
        
        xmlCreater.setOutput(outputStream, StaticDatas.UTF8);
        
        xmlCreater.startDocument(StaticDatas.UTF8, true);
        
        // XML_ROOT 常量 写死 的 根节点 list
        xmlCreater.startTag(null, StaticDatas.XML_ROOT);
        
        for (Object mtmp : data) {
            // 此处开始循环创建
            xmlCreater.startTag(null, clazzName);
            
            for (Iterator<Entry<String, Method>> iter = mdatas.entrySet().iterator(); iter.hasNext();) {
                Entry<String, Method> entry = iter.next();
                String key = entry.getKey();
                Method method = entry.getValue();
                Object obj = method.invoke(mtmp, new Object[]{});
                
                xmlCreater.startTag(null, key);
                xmlCreater.text(obj.toString());
                xmlCreater.endTag(null, key);
            }
            
            // 循环创建结束
            xmlCreater.endTag(null, clazzName);
        }
        
        xmlCreater.endTag(null, StaticDatas.XML_ROOT);
        
        xmlCreater.endDocument();
        
        xmlCreater.flush();
        
        if(outputStream != null){
            outputStream.close();
        }
        
        xmlCreater = null;
    }
}

 

Android中Xml工具类的封装

标签:

原文地址:http://www.cnblogs.com/cbooy/p/4965073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!