学过DOM SAX 解析 大家一定觉得 Dom太复杂了 Sax 相对来说 结构清晰明了 简单多了 但是 个人 还是要说 Pull解析 ,pull解析跟Sax解析思路 类似:
先说一下他们的区别吧
DOM 整篇文件读到内存中 更新快,但是 文件大的话 效率低
SAX 按标签对解析 效率高 速度快 占用内存少
PULL 按标签对解析 解析速度快 思路与SAX类似 简单易用
SAX 与PULL的区别:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。也就是说pull是一个while循环,随时可以跳出,而sax不是,sax是只要解析了,就必须解析完成,在解析过程中在读取到特定tag时调用相应处理事件。
还是PULL常用一些:
//创建Xmlpullparser对象
XmlPullParser pullParser = Xml.newPullParser();
try
{
//打开本地xml文件
pullParser.setInput(getAssets().open("data.xml"), "utf-8");
String tagName = "";//创建一个变量存储当前读到的标签名字
int eventType = pullParser.getEventType();//用于存储当前状态
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {//根据状态判断 该做什么操作
case XmlPullParser.START_DOCUMENT:
Log.i("zzz", "文档开始读取");
break;
case XmlPullParser.START_TAG:
tagName = pullParser.getName();
Log.i("zzz", "读取到开始标签" + tagName);
//比如标签名字是tagName
就创建类的实例
if ("person".equals(tagName)) {
person = new Person();//可以创建容器
String id = pullParser.getAttributeValue(0).trim();
person.setId(Integer.parseInt(id));
}
break;
case XmlPullParser.TEXT:
//如果读到的标签是tagName获取里面的文本内容
if ("name".equals(tagName)) {
person.setName(pullParser.getText().trim());
Log.i("zzz", "文件内容" +
pullParser.getText().trim());
} else if ("age".equals(tagName)) {
person.setAge(pullParser.getText().trim());
Log.i("zzz", "文件内容" +
pullParser.getText().trim());
}
break;
case XmlPullParser.END_TAG://读到结束标签,在这里可做存储等操作
tagName = pullParser.getName();
if ("person".equals(tagName)) {
Log.i("zzz", person.toString());
person = null;
}
tagName = "";
break;
case XmlPullParser.END_DOCUMENT:
Log.i("zzz", "文档解析结束");
break;
default:
break;
}
eventType = pullParser.next();//改变状态进入下一个状态
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}