博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android pull封装,直接解析xml
阅读量:4189 次
发布时间:2019-05-26

本文共 7993 字,大约阅读时间需要 26 分钟。

         好久没写过博文了,最近在做xml方面的解析,xml的解析一直都是比较繁琐的,所以对android的 pull进行了简单的封装,不用再为每个xml都创建解析类,但目前只实现了对xml的简单实现,主要通过反射来实现

        能解析的xml形式主要有如下几种,复杂的暂未支持

张三
zhangsan@xxx.com
2
李四
lisi@xxx.com
3
王五
wangwu@xxx.com
对应的java类如下:

public class User {    private int id;    private String userName;    private String email;         public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }          }
支持简单的对象解析

1
1002
测试
或者

测试
对应的java类如下:

public class Menu {    private int id;    private int code;    private String name;         public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }     }
支持对象中有list列表的解析

33
1
张三
zhangsan@xxx.com
李四
lisi@xxx.com
wangwu@xxx.com
对应的java类如下:

import java.util.List; public class UserList {    private int total;    private List
user; public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public List
getUser() { return user; } public void setUser(List
user) { this.user = user; }}
xml解析器代码如下:

import java.io.InputStream;import java.lang.reflect.Field;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.List; import org.xmlpull.v1.XmlPullParser; import android.util.Log;import android.util.Xml; /** * 对pull解析xml进行了封装,不用给每个xml,再创建一个解析类 * * @author steven * * http://www.juziku.com/sunlightcs/ * */public class XmlParse {         /**     * 解析XML     * @param is        xml字节流     * @param clazz     字节码      如:Object.class     * @param startName       开始位置     * @return          返回List列表     */    @SuppressWarnings({ "rawtypes", "unchecked" })    public List getXmlList(InputStream is, Class
clazz, String startName) { List list = null; XmlPullParser parser = Xml.newPullParser(); Object object = null; try { parser.setInput(is, "UTF-8"); //事件类型 int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: list = new ArrayList(); break; case XmlPullParser.START_TAG: //获得当前节点元素的名称 String name = parser.getName(); if (startName.equals(name)) { object = clazz.newInstance(); //判断标签里是否有属性,如果有,则全部解析出来 int count = parser.getAttributeCount(); for(int i=0; i
clazz) { XmlPullParser parser = Xml.newPullParser(); Object object = null; List list = null; Object subObject = null; String subName = null; try { parser.setInput(is, "UTF-8"); //事件类型 int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: object = clazz.newInstance(); break; case XmlPullParser.START_TAG: //获得当前节点元素的名称 String name = parser.getName(); Field[] f = null; if(subObject == null){ f = object.getClass().getDeclaredFields(); //判断标签里是否有属性,如果有,则全部解析出来 int count = parser.getAttributeCount(); for(int j=0; j
subClazz = (Class
)((ParameterizedType)type).getActualTypeArguments()[0]; subObject = subClazz.newInstance(); subName = f[i].getName(); //判断标签里是否有属性,如果有,则全部解析出来 int count = parser.getAttributeCount(); for(int j=0; j
(); f[i].setAccessible(true); f[i].set(object, list); } } }else{ //普通属性 if(subObject != null){ setXmlValue(subObject, name, parser.nextText()); }else{ setXmlValue(object, name, parser.nextText()); } } break; } } break; case XmlPullParser.END_TAG: if (subObject != null && subName.equalsIgnoreCase(parser.getName())) { list.add(subObject); subObject = null; subName = null; } break; } eventType = parser.next(); } } catch (Exception e) { Log.e("xml pull error", e.getMessage()); } return object; } /** * 把xml标签的值,转换成对象里属性的值 * @param t 对象 * @param name xml标签名 * @param value xml标签名对应的值 */ private void setXmlValue(Object t, String name, String value){ try { Field[] f = t.getClass().getDeclaredFields(); for(int i = 0; i < f.length; i++){ if(f[i].getName().equalsIgnoreCase(name)){ f[i].setAccessible(true); //获得属性类型 Class
fieldType = f[i].getType(); if(fieldType == String.class) { f[i].set(t, value); }else if(fieldType == Integer.TYPE) { f[i].set(t, Integer.parseInt(value)); }else if(fieldType == Float.TYPE) { f[i].set(t, Float.parseFloat(value)); }else if(fieldType == Double.TYPE) { f[i].set(t, Double.parseDouble(value)); }else if(fieldType == Long.TYPE) { f[i].set(t, Long.parseLong(value)); }else if(fieldType == Short.TYPE) { f[i].set(t, Short.parseShort(value)); }else if(fieldType == Boolean.TYPE) { f[i].set(t, Boolean.parseBoolean(value)); }else{ f[i].set(t, value); } } } } catch (Exception e) { Log.e("xml error", e.toString()); } } }

转载地址:http://tapoi.baihongyu.com/

你可能感兴趣的文章
软件测试时代发展5周年的一个总结
查看>>
软件测试工程师的职业发展综述
查看>>
第33次(北京)软件测试交流会定于11月4日(周日)在北京举行
查看>>
关于软件测试人员绩效考核的讨论
查看>>
国内质量意识的变更过程
查看>>
测试时代软件测试交流会4月15日北京举行
查看>>
测试时代论坛中测试新手的职业发展困惑
查看>>
软件测试过程的监控方法
查看>>
软件企业质量保证的基石――QA、QC的良性协作
查看>>
TDD的三条规则(中英对照)
查看>>
敏捷软件开发基础:进行有效的客户协作
查看>>
敏捷软件开发基础: 持续集成环境的构建
查看>>
A draft TOC of 嵌入式电信软件敏捷开发实践
查看>>
"Balancing Agility and Discipline" 中文版——《平衡敏捷与规范》终于要出版了
查看>>
软件思考系列之二
查看>>
需求工程???
查看>>
清晰性和可测试性的权衡
查看>>
软件思考系列之一
查看>>
测试观念谈
查看>>
Layers, Levels, and DIP铪铪
查看>>