转载请注明出处 http://blog.csdn.net/luckty/article/details/72782725
之前的开发中都是使用sp存储数据获取,或者网络存储。偶然在技术讨论群里边有人在说怎么解析xml,所以就想要不写一个xml解析的工具类
那我就心想打算做一个解析的类
解析方式:XmlPullPaser
一、首先我们建一个XML
user.xnl
<?xml version="1.0" encoding="UTF-8"?> <users> <user > <name>Mars</name> <age>26</age> <sex>男</sex> </user> <user > <name>Lynn</name> <age>24</age> <sex>女</sex> </user> <user > <name>Kervin</name> <age>未知</age> <sex>未知</sex> </user> </users>
看一下结构
开头是<users></users> 对标签 名字其实无所谓,不过不要和下面的属性标签相同
中间就是<user></user> 以及user属性标签就不过多解释了,树形结构
二、创建解析类
在了解xml数据结构之后我们开始使用xmlpullparser去解析
创建一个类XmlPullPaserUtils
创建方法getObject();
为了能够通用,所以我使用了泛型去作为实体类Bean
方法参数说:
1、InputStream 输入流,用于读取xml文件
2、Class<T> clazz 实体类
3、tag 就是标签类的list
4、解析处理回调
public static <T extends Object> ArrayList<T> getObject(InputStream xml, Class<T> clazz, ArrayList<String> tag, XmlPullPaserCallBack xmlPullPaserCallBack) throws Exception { ArrayList<T> objList = null; T obj = null; XmlPullParser pullParser = Xml.newPullParser(); pullParser.setInput(xml, "UTF-8"); //为Pull解释器设置要解析的XML数据 int event = pullParser.getEventType();//判断xml标签类型 while (event != XmlPullParser.END_DOCUMENT) {//循环判断 switch (event) { case XmlPullParser.START_DOCUMENT://解析文档开始标志 objList = new ArrayList<T>(); //初始化beanlist break; case XmlPullParser.START_TAG: if (tag.get(0).equals(pullParser.getName())) {//判断是不是taglist中的第一个bean标签 obj = clazz.newInstance();//初始化泛型 event = pullParser.next();//继续往下找tag } for (int i = 1; i < tag.size() - 1; i++) { if (tag.get(i).equals(pullParser.getName())) {
xmlPullPaserCallBack.setParams(obj, tag.get(i), pullParser.nextText());//回调处理Bean类属性设置
event = pullParser.next();
//继续往下找tag
} } break; case XmlPullParser.END_TAG://end 标志
//end of xml if (tag.get(tag.size() - 1).equals(pullParser.getName())) { objList.add(obj); obj = null; } break; } event = pullParser.next(); } return objList; }
//回调内部接口类
public interface XmlPullPaserCallBack { void setParams(Object obj, String paramsName, String value); }
到这里工具类就写好了,现在来看一个例子
//x新建bean类
public class User { public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } private String name; private String age; public User(){ } public User(String name, String age, String sex) { this.name = name; this.age = age; this.sex = sex; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age='" + age + '\'' + ", sex='" + sex + '\'' + '}'; } private String sex; }
由于获取需要有四个参数 我们就先初始化这个参数
接口实现方法
运行看解析结果