Android下Xml解析技术(三)、pull解析Xml文件
2015-09-27 23:01
656 查看
转载/article/2232744.html
Android系统还提供了另一种XML解析方式可以使你更好的处理这种情况,就是Pull方式解析XML数据。Pull解析xml项目是一个开源的项目,只不过android系统将它集中进去了。官网:http://www.xmlpull.org
Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。
而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件(开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等),但需要调用next()
方法提取它们(主动提取事件)。
Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创建XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。
下面看看pull技术具体如何解析xml文件。
依然是解析这个简单的文件:
[java]
view plaincopyprint?
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>Lucy</name> <age>15</age> </person> <person id="2"> <name>Tim</name> <age>20</age> </person> </persons>
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="1"> <name>Lucy</name> <age>15</age> </person> <person id="2"> <name>Tim</name> <age>20</age> </person> </persons>
解析代码:
[java]
view plaincopyprint?
public void pullParseXml() throws XmlPullParserException, IOException {
// 构建解析器
XmlPullParser parser = Xml.newPullParser();
// 获得xml文件的输入流,获得文档对象
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");
parser.setInput(inputStream, "UTF-8");
//开始解析
int eventType=parser.getEventType();//产生第一个事件
List<Person> persons=null;
Person person=null;
while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件 文档结束
switch (eventType) {//判断事件的类型
case XmlPullParser.START_DOCUMENT: //开始文档
persons=new ArrayList<Person>();
break;
case XmlPullParser.START_TAG: //开始元素节点
String name1=parser.getName();//获 取解析器当前指向元素节点的名称
if("person".equals(name1)){//如果指向person节点
person=new Person();
person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值
}else if ("name".equals(name1)) {
person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值
}else if ("age".equals(name1)) {
person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值
}
break;
case XmlPullParser.END_TAG://结束元素节点
String name2=parser.getName();
if("person".equals(name2)){//如果指向/person节点
persons.add(person);
person=null;
}
break;
}
eventType=parser.next();//解析器向下移动一个单位
}
for (Person p : persons) {
System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());
}
}
public void pullParseXml() throws XmlPullParserException, IOException { // 构建解析器 XmlPullParser parser = Xml.newPullParser(); // 获得xml文件的输入流,获得文档对象 InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml"); parser.setInput(inputStream, "UTF-8"); //开始解析 int eventType=parser.getEventType();//产生第一个事件 List<Person> persons=null; Person person=null; while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件 文档结束 switch (eventType) {//判断事件的类型 case XmlPullParser.START_DOCUMENT: //开始文档 persons=new ArrayList<Person>(); break; case XmlPullParser.START_TAG: //开始元素节点 String name1=parser.getName();//获 取解析器当前指向元素节点的名称 if("person".equals(name1)){//如果指向person节点 person=new Person(); person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值 }else if ("name".equals(name1)) { person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值 }else if ("age".equals(name1)) { person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值 } break; case XmlPullParser.END_TAG://结束元素节点 String name2=parser.getName(); if("person".equals(name2)){//如果指向/person节点 persons.add(person); person=null; } break; } eventType=parser.next();//解析器向下移动一个单位 } for (Person p : persons) { System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge()); } }
相关文章推荐
- Android下Xml解析技术(二)、DOM解析Xml文件
- Android下Xml解析技术(一)、SAX解析Xml文件
- Android android:gravity和android:layout_gravity的区别
- android ListView向上滑动隐藏标题,下拉显示标题栏
- Android dispatchTouchEvent touch事件的分发
- idea or android studio 使用
- 百度云分享,以前找到的各种东东,分享给大家···Office软件(全-C)
- Android 中的 Service 全面总结(转载)
- Android学习入门
- Android入门——远程Remote Service AIDL详解及应用
- android中fragment实现底部标签页的切换
- android开发笔记——android工程目录结构:
- Android——Layout:RelativeLayout
- Android Device Monitor的 “provide the path to the Android SDK”问题解决方案
- android应用开发全程实录-你有多熟悉listview?
- Android的Message机制(简单小结)
- Android 线程 thread 两种实现方法!
- Android——Layout:LinearLayout
- Android——Layout:LinearLayout
- Action Bar