Pull解析
(一)概述
1、Pull解析器是一个开源的Java项目,Android系统内部解析xml文件均为此种方式。Pull是轻量级的解析。在Android 的内核中已经内嵌了Pull,所以不需要再添加第三方jar包来支持Pull。
2、Pull读取XML文件时采用事件触发机制,事件这里是指文档开始、标签开始、标签结束、文档结束等。Pull将事件用整型数据表示,不同的事件用不同的整数表示,如此极大地简化了解析代码的书写。
3、Pull以流的方式解析XML文档,Pull解析可以在程序中控制想解析到哪里就可以停止解析。
4、Android系统默认使用Pull解析XML文档。
(二)相关类/接口
1、XmlPullFactory类:解析器工厂类,用于创建解析器对象。
2、XmlPullParser类:解析器类,用于解析XML文档。
(三)XmlPullFactory类的常用方法
public static XmlPullFactory newInstance()
作用:返回一个XmlPullFactory对象。
(四)XmlPullParser类的常用方法
1.public void setInput(InputStream inputStream,String inputEncoding) 作用:设置需要解析的输入流对象。 参数——inputStream:输入流对象 参数——inputEncoding:xml文档的编码格式 2.public int getEventType() 作用:返回当前事件的类型值,常用事件类型值。 说明: 1)XmlPullParser.START_DOCUMENT:文档开始 2)XmlPullParser.END_DOCUMENT:文档结束 3)XmlPullParser.START_TAG:标签开始 4)XmlPullParser.END_TAG:标签结束 3.public int next() 作用:获取下一个解析器事件 4.public String getName() 作用:返回当前元素名即标签名称 5.public String getAttributeValue(int index) 作用:返回指定索引值的属性值
(五)使用步骤
步骤1、创建解析器工厂对象,示例代码: factory = XmlPullParserFactory.newInstance(); 步骤2、创建解析器对象,示例代码: XmlPullParser parser = factory.newPullParser(); 步骤3、获取输入流对象,示例代码: InputStream in = new FileInputStream("d:/se2/day12/user.xml"); 步骤4、设置解析器操作的输入流对象并设置编码格式,示例代码: parser.setInput(in,"urf-8"); 步骤5、以下循环一次读取XML文档中的每个节点,示例代码: for(int type = parser.getEventType(); //获取解析的事件 type != XmlPullParser.END_DOCUMENT;// 不是文档结束事件 type = parser.next()){ // 获取下一个事件 // 在循环中编写获取每个XML节点的代码,例如: String tagName = parser.getName();// 获取当前节点的名称 ... }
实际案例:
package com.jxust.elts.dao; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Array; import java.util.ArrayList; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import com.jxust.elts.entity.ExamInfo; import com.jxust.elts.entity.Files; import com.jxust.elts.entity.Question; import com.jxust.elts.entity.User; import com.jxust.elts.utils.HttpUtils; import com.jxust.elts.utils.HttpUtils.RequestMethod; import android.R.array; import android.content.Context; import android.util.Xml; public class ExamBao_PullParse extends ExamDaoBase implements IExamDao { Files mFiles; public ExamBao_PullParse(Context context) { mFiles = getFiles(context); // 获取当前下载的文件的url } @Override public ArrayList<Question> loadQuestions() { // ===========采用Pull解析=============== ArrayList<Question> questions = new ArrayList<Question>(); String url = mFiles.getUrl() + mFiles.getFnQuestion(); // 获取完整路径 InputStream in = null; try { in = HttpUtils.getInputStream(url, null, RequestMethod.GET); XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(in,"utf-8"); for(int evenType = XmlPullParser.START_DOCUMENT; // 初始条件是要从开始文档事件开始 evenType != XmlPullParser.END_DOCUMENT; // 结束循环是判断是否到达了结束文档事件 evenType = parser.next()){ // 每次执行后都会跳到下一个事件 if(evenType == XmlPullParser.START_TAG){ // 标签开始 String tagName = parser.getName(); if("question".equals(tagName)){ String answer = parser.getAttributeValue(null, "answer"); // 第一个表示名字空间,第二个表示属性值 ArrayList<String> answers = new ArrayList<String>(); for(int i = 0;i < answer.length();i++){ answers.add(answer.charAt(i)+""); } int score = Integer.parseInt(parser.getAttributeValue(null,"score")); int level = Integer.parseInt(parser.getAttributeValue(null, "level")); String title = parser.getAttributeValue(null,"title"); StringBuilder options = new StringBuilder(); for(int i = 4;i <= 7;i++){ options.append(parser.getAttributeValue(i)).append("\n"); } Question q = new Question(answers, level, score, title, options.toString()); questions.add(q); } } } return questions; } catch (Exception e) { e.printStackTrace(); }finally { if(in != null){ try { in.close(); // 关闭输入流资源 } catch (IOException e) { e.printStackTrace(); } } HttpUtils.closeClient(); // 关闭服务器服务 } return null; } @Override public ExamInfo loadExamInfo() { // ===========采用Pull解析=============== String url = mFiles.getUrl() + mFiles.getFnExamInfo(); // 这个就是完整的地址 InputStream in = null; try { in = HttpUtils.getInputStream(url, null, HttpUtils.RequestMethod.GET); XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); // 创建用于Pull解析的解析器 parser.setInput(in,"utf-8"); // 设置需要解析的输入流对象,参数1:输入流对象,参数2:输入流对象编码方式 ExamInfo examInfo = new ExamInfo(); for(int eventType = XmlPullParser.START_DOCUMENT; // 循环开始是开始文档 eventType != XmlPullParser.END_DOCUMENT; // 循环结束是文档结束 eventType = parser.next()){ // 操作完一次以后就跳到下一个事件 if(eventType == XmlPullParser.START_TAG){ // 如果是标签开始 String tagName = parser.getName(); // 获取标签名称 if("exam info".equals(tagName)){ examInfo.setSubjectTitle(parser.getAttributeValue(0)); // 拿到考试名称 examInfo.setLimitTime(Integer.parseInt(parser.getAttributeValue(1))); // 拿到考试时间 examInfo.setQuestionCount(Integer.parseInt(parser.getAttributeValue(2))); // 拿到考题数量 return examInfo; // 就只有一个所以直接返回 } } } } catch (Exception e) { e.printStackTrace(); }finally { if(in != null){ try { in.close(); // 关闭输入流 } catch (IOException e) { e.printStackTrace(); } } HttpUtils.closeClient(); // 把服务器的连接也关掉 } return null; } @Override protected void loadUsers() { String url = mFiles.getUrl() + mFiles.getFnUser(); // 获取完整的Url地址 InputStream in = null; try { in = HttpUtils.getInputStream(url, null, HttpUtils.RequestMethod.GET); XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setInput(in,"utf-8"); for(int evenType = XmlPullParser.START_DOCUMENT; evenType != XmlPullParser.END_DOCUMENT; evenType = parser.next()){ if(evenType == XmlPullParser.START_TAG){ String tagName = parser.getName(); if("user".equals(tagName)){ int id = Integer.parseInt(parser.getAttributeValue(null, "id")); String name = parser.getAttributeValue(null, "name"); String password = parser.getAttributeValue(null,"passsword"); String phone = parser.getAttributeValue(null, "phone"); String email = parser.getAttributeValue(null, "email"); User user = new User(id, name, password, phone, email); mUsers.put(user.getId(), user); // 将user存到本地 } } } } catch (Exception e) { e.printStackTrace(); }finally { if(in != null){ try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } HttpUtils.closeClient(); } } }
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="examInfo"> 考试科目:core java 考生编号:1001\n 考试时间:10分钟 考题数量:20</string> <string name="question">1.能直接由计算机硬件识别的是______。\n A.高级语言\n B.中级语言\n C.汇编语言\n D.机器语言 </string> <string name="app_name">在线考试</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="root_url">http://10.0.2.2/</string> <string name="user_txt">elts-txt/users.txt</string> <string name="exam_info_txt">elts-txt/exam_info.txt</string> <string name="question_txt">elts-txt/questions.txt</string> <string name="user_xml">elts-xml/users.xml</string> <string name="exam_info_xml">elts-xml/exam_info.xml</string> <string name="question_xml">elts-xml/questions.xml</string> <string name="user_json">elts-json/users.json</string> <string name="exam_info_json">elts-json/exam_info.json</string> <string name="question_json">elts-json/questions.json</string> <!-- parse_mode代表解析文件的类型,有四种可选值: txt:文本文件 pull_xml:xml文件 sax_xml:sax解析,使用的xml文件与pull_xml相同 json:json文件 --> <string name="parse_mode">pull_xml</string> <string name="title_activity_login">登录窗口</string> <string name="title_activity_exam">考试窗口</string> <string name="title_activity_main_menu">考试主窗口</string> </resources>
相关推荐
本文主要关注Android中的Pull解析方式来处理XML,这是一种轻量级、低内存占用的解析方法。 **什么是XML Pull解析** XML Pull解析器(XML Pull Parser)是一种事件驱动的解析模型,它不需要完整的XML文档加载到内存...
该文章详细介绍了在Android环境下如何使用SAX和PULL解析XML,包括代码示例和步骤说明,对于初学者来说非常有帮助。 最后,压缩包中的"Weather"文件很可能是示例的天气预报XML数据。通过实际解析这个文件,你可以更...
在本主题"Android之PULL解析XML文件——新浪微博客户端首页效果"中,我们将深入探讨如何利用PULL解析器(PullParser)来处理XML数据,从而实现类似新浪微博客户端首页的动态效果。这种效果通常包括新闻标题、摘要、...
本教程将深入探讨如何在Android系统中使用Pull解析器(Pull Parser)来读取和解析XML文件,以实现高效的数据处理。我们将通过分析"ReadXmlByPull"的源码来理解这一过程。 首先,让我们了解什么是Pull解析器。Pull...
本主题将深入探讨如何使用Android中的Pull解析器(Pull Parser)来读取和解析XML文件。Pull解析器是一种事件驱动的解析方式,它不需要完整的XML文档加载到内存中,而是按需读取,降低了内存消耗。 首先,让我们理解...
本文将重点介绍SAX解析的一种实现方式——Pull解析。 Pull解析器(XMLPullParser)是Android SDK提供的一种轻量级、高效的XML解析方式,它不需要创建整个XML文档的树结构,而是通过事件触发的方式解析XML,从而节省...
"android的pull解析"是指Android系统提供的一种轻量级、低内存占用的数据解析方式——XML Pull解析器。这种解析方式允许应用程序在XML文档中移动,读取和解析元素,而无需将整个文档加载到内存中。本文将深入探讨...
Android系统提供了一种轻量级的XML解析方式——PULL解析器(Pull Parser),它适用于处理大型XML文档,因为它不需要像DOM解析器那样一次性加载整个XML文档到内存中。PULL解析器通过事件驱动的方式,按需解析XML文档...
本项目主要关注的是XML的创建和使用Pull解析器来解析XML,这是Android系统中处理XML数据的一种高效方法。接下来,我们将详细讨论这两个知识点。 首先,XML(Extensible Markup Language)是一种用于标记数据的语言...
本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...
本压缩包“安卓Android源码——ReadXmlByPull1.rar”显然包含了关于如何在Android平台上使用Pull解析器读取XML的示例代码。Pull解析器是一种轻量级的XML解析方法,它不需要像SAX或DOM那样预先加载整个XML文档,而是...
本压缩包文件"安卓Android源码——比较通用的xml解析方法.zip"可能包含了一些关于如何在Android系统中解析XML的通用方法和技术。以下是关于Android XML解析的一些关键知识点: 1. **DOM解析**: - DOM(Document ...
"安卓Android源码——ReadXmlByPull.rar"这个压缩包很可能包含了一个使用Pull解析器读取XML的示例项目。Pull解析器是Android系统提供的一种轻量级、高效的XML解析方式,相比DOM和SAX,它更适合内存有限的移动设备。 ...
总的来说,这份源码涵盖了Android开发中的核心技能之一——XML解析,无论是对DOM的深入理解还是对Pull解析的实践操作,都将对你的Android编程能力有显著提升。通过学习和研究,你不仅可以增强技术实力,还能为未来的...
5. **Pull解析模式**:这里的"pull"可能指的是Android的XML解析库——`PullParser`。它提供了一种高效、低内存占用的方式来解析XML流,通过调用`next()`方法拉取下一个事件,而不是像DOM那样一次性加载整个文档。在...
Android提供了一个基于事件的解析库——Pull解析器,其原理与SAX类似,但更轻量级且专为Android设计。通过创建`XmlPullParserFactory`,然后调用`newPullParser()`方法创建`XmlPullParser`,再设置解析事件监听器,...
Android提供了一种基于事件的解析方式——Pull解析器(XMLPullParser)。它不需要一次性加载整个XML文档到内存,而是逐行读取,节省了资源。首先,我们需要实例化XMLPullParser,并设置输入流: ```java ...
除了DOM和SAX,Android还提供了一个基于SAX的解析器——Pull解析器。Pull解析器是轻量级的,它允许开发者手动控制解析过程,通过调用`XmlPullParser`接口的方法来遍历XML文档。与SAX相比,Pull解析器更易于使用,...
本篇文章将深入探讨XML在Android中的三种主要解析方式:DOM解析、SAX解析和Pull解析,帮助开发者更好地理解和运用这些方法。 1. DOM解析(Document Object Model) DOM解析器会将整个XML文档加载到内存中,形成一个...