您的位置:首页 > 其它

Pull解析Xml

2016-06-30 07:47 162 查看
学过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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml PULL