- 浏览: 625156 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
luo_ganlin:
别的不多说,点个赞!
关于Android隐式启动Activity -
IWSo:
谢楼主!研究了好久,原来是这样!
android中如何让LinearLayout实现点击时背景图片切换 -
fantao005x:
粘帖的不错
android中如何让listview的内容全部显示出来 -
learner576539763:
Android_gqs 写道请问博主,Viewstub 可实现 ...
android中ViewStub使用 -
goontosoon:
抄的什么啊,狗屁不通
对ContentProvider中getType(Uri uri)
好久没写过博文了,最近在做xml方面的解析,xml的解析一直都是比较繁琐的,所以对android的 pull进行了简单的封装,不用再为每个xml都创建解析类,但目前只实现了对xml的简单实现,主要通过反射来实现
能解析的xml形式主要有如下几种,复杂的暂未支持
<?xml version="1.0" encoding="UTF-8"?> <list> <user id="1"> <userName>张三</userName> <email>zhangsan@xxx.com</email> </user> <user> <id>2</id> <userName>李四</userName> <email>lisi@xxx.com</email> </user> <user> <id>3</id> <userName>王五</userName> <email>wangwu@xxx.com</email> </user> </list>
对应的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; } }
支持简单的对象解析
<?xml version="1.0" encoding="UTF-8"?> <menu> <id>1</id> <code>1002</code> <name>测试</name> </menu>
或者
<?xml version="1.0" encoding="UTF-8"?> <menu id="1" code="1002"> <name>测试</name> </menu>
对应的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列表的解析
<?xml version="1.0" encoding="UTF-8"?> <parent> <total>33</total> <list> <user> <id>1</id> <userName>张三</userName> <email>zhangsan@xxx.com</email> </user> <user id="2"> <userName>李四</userName> <email>lisi@xxx.com</email> </user> <user id="3" userName="王五"> <email>wangwu@xxx.com</email> </user> </list> </parent>
对应的java类如下:
import java.util.List; public class UserList { private int total; private List<User> user; public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public List<User> getUser() { return user; } public void setUser(List<User> 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<Object>(); 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<count; i++) setXmlValue(object, parser.getAttributeName(i), parser.getAttributeValue(i)); } else if (object != null) { setXmlValue(object, name, parser.nextText()); } break; case XmlPullParser.END_TAG: if (startName.equals(parser.getName())) { list.add(object); object = null; } break; } eventType = parser.next(); } } catch (Exception e) { Log.e("xml pull error", e.toString()); } return list; } /** * 解析XML * @param is xml字节流 * @param clazz 字节码 如:Object.class * @return 返回Object */ @SuppressWarnings({ "unchecked", "rawtypes" }) public Object getXmlObject(InputStream is, Class<?> 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<count; j++) setXmlValue(object, parser.getAttributeName(j), parser.getAttributeValue(j)); }else{ f = subObject.getClass().getDeclaredFields(); } for(int i = 0; i < f.length; i++){ if(f[i].getName().equalsIgnoreCase(name)){ //判断是不是List类型 if(f[i].getType().getName().equals("java.util.List")){ Type type = f[i].getGenericType(); if (type instanceof ParameterizedType) { //获得泛型参数的实际类型 Class<?> subClazz = (Class<?>)((ParameterizedType)type).getActualTypeArguments()[0]; subObject = subClazz.newInstance(); subName = f[i].getName(); //判断标签里是否有属性,如果有,则全部解析出来 int count = parser.getAttributeCount(); for(int j=0; j<count; j++) setXmlValue(subObject, parser.getAttributeName(j), parser.getAttributeValue(j)); if(list == null){ list = new ArrayList<Object>(); 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()); } } }
发表评论
-
EditText软键盘弹出问题解决
2013-02-26 23:10 1412当带有EditView的activity第一次进入时,第一 ... -
android中获取系统相关属性adb
2012-11-15 14:41 21561.查看系统相关属性可以通过: adb shell ... -
Android使用Intent传递复杂参数及复杂参数列表
2012-11-05 17:29 1582刚开始一直纠结于Intent只能put像int, ... -
解决P6200/P6800扩展卡第三方软件不可写的BUG
2012-11-05 17:01 990从XDA看来的步骤:1. Using a root-e ... -
android 中跟actionbar相关的属性
2012-10-25 17:07 2439android:uiOptions 这个属性用于设置A ... -
source insight使用快捷键
2012-10-25 10:59 1513F5指定行号,实现行跳转,在遇到编译错误的时候,能特 ... -
android中推出应用比较有效率的方法
2012-10-11 16:57 1127添加一个全局变量作为程序退出的标记(boolean类型) ... -
declare-styleable的使用
2012-10-09 13:59 1126declare-styleable的使用 decl ... -
android程序安全的建议
2012-09-29 14:58 5222如果保证自己的 ... -
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
2012-09-29 14:45 1039从 Java 5 开始,Java 提供了自己的线程池。线 ... -
android应用检测更新代码
2012-09-24 17:40 1755JAVA代码: UpdateManager.java ... -
adb命令详解
2012-09-19 15:04 2788Android adb的常用命令略解 Androi ... -
android中屏蔽其它系统按钮的dialog
2012-09-18 10:13 1611public class MyProgress ... -
如何给Scrollview里内容截屏并生成bitmap,注意:Scrollview里面内容较多有滚动了
2012-09-18 10:07 1604使用for循环递归累加其内部的子控件的高度: p ... -
wakelock的使用
2012-09-17 11:44 10036PowerManager.WakerLock是我分析St ... -
启动另外一个apk
2012-09-14 13:16 860这篇博文主要是获取其他apk程序的启动的主intent, ... -
android中全屏的方法
2012-09-14 13:04 9291.直接代码编写 @Override ... -
android:installLocation简析
2012-09-12 15:25 1073在Froyo(android 2.2,API Le ... -
外部apk启动启动另外一个apk
2012-09-06 17:54 1012public class TestingBroadc ... -
listview如何实现圆角
2012-09-05 17:32 1904首先呢,我们还是看几个示图:(这是360推出的一款天气预 ...
相关推荐
android下解析xml文件的demo
在android中使用pull解析xml文件
Android 获取系统内存、保存解析xml demo Android 获取系统内存、保存解析xml demo
Android使用Dom方式解析XML,虽然xml文件太大时不建议用dom方式解析,但是如果文件比较小,也不失为一种选择。项目中xml放在assets文件夹下,view绑定使用butterknife
本例使用多种方式获取本地XML文件,还有通过url获取XML文件,使用Android内置的PULL解析器对XML文件进行解析,例子是解析我国各个省市。 《Android解析XML文件》博文路径:...
在android平台下使用PULL解析XML源码。
java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...
昨两天偶然在csdn上学习到Android中解析XML,感觉博主写得清晰易懂,但是未有源码,于是自己整理了一下。学习参考:http://blog.csdn.net/liuhe688/article/details/6415593/
android xml pull解析示例,自己mark下,备忘
在Android中,使用SAX和PULL解析XML,本项目中以解析天气预报为例。 详情见博客:http://blog.csdn.net/yalin18/article/details/7437752
支持SAX解析XML文件,DOM解析XML文件,Pull解析器解析XML文件,Pull生成XML文件,JAVA和Kotlin两种语言编写
Android解析xml(3)---Pull解析
Android网络编程之Pull解析XML文件~
Android 解析xml文件 博客:http://blog.csdn.net/dadaxiaoxiaode/article/details/9618945
android解析xml实例
Android中解析xml的三种方式DOM SAX PULL,以及各自优缺点
使用Android自带的XML解析器PULL解析器简单的解析xml,并将内容显示在TestView上,代码简化过。
android XML本地解析实例 android XML本地解析实例
解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml解析xml
Android中XML的数据解析代码。博客地址请关注:http://blog.csdn.net/yegongheng