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();
}
先说一下他们的区别吧
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();
}
相关文章推荐
- Pull is not possible because you have unmerged ...
- XML 与 JSON 优劣对比
- As3.0 xml + Loader应用代码
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- 实例解析Ruby程序中调用REXML来解析XML格式数据的用法
- Ruby中XML格式数据处理库REXML的使用方法指南
- C#中如何使用 XmlReader 读取XML文件
- C#针对xml基本操作及保存配置文件应用实例
- Ruby使用REXML库来解析xml格式数据的方法
- Ruby程序中创建和解析XML文件的方法
- Ruby的XML格式数据解析库Nokogiri的使用进阶
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- EBS xml publisher中文乱码问题及解决办法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总
- C# XML序列化方法及常用特性总结分析