`

安卓——Pull解析

阅读更多

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>

 

 

 

1
1
分享到:
评论

相关推荐

    Android XML解析—— Pull解析XML(待完善)

    本文主要关注Android中的Pull解析方式来处理XML,这是一种轻量级、低内存占用的解析方法。 **什么是XML Pull解析** XML Pull解析器(XML Pull Parser)是一种事件驱动的解析模型,它不需要完整的XML文档加载到内存...

    Android中,使用SAX和PULL解析天气预报XML

    该文章详细介绍了在Android环境下如何使用SAX和PULL解析XML,包括代码示例和步骤说明,对于初学者来说非常有帮助。 最后,压缩包中的"Weather"文件很可能是示例的天气预报XML数据。通过实际解析这个文件,你可以更...

    Android之PULL解析XML文件——新浪微博客户端首页效果

    在本主题"Android之PULL解析XML文件——新浪微博客户端首页效果"中,我们将深入探讨如何利用PULL解析器(PullParser)来处理XML数据,从而实现类似新浪微博客户端首页的动态效果。这种效果通常包括新闻标题、摘要、...

    安卓Android源码——ReadXmlByPull使用Pull解析Xml文件.zip

    本教程将深入探讨如何在Android系统中使用Pull解析器(Pull Parser)来读取和解析XML文件,以实现高效的数据处理。我们将通过分析"ReadXmlByPull"的源码来理解这一过程。 首先,让我们了解什么是Pull解析器。Pull...

    Android源码——ReadXmlByPull 使用Pull解析Xml文件.zip

    本主题将深入探讨如何使用Android中的Pull解析器(Pull Parser)来读取和解析XML文件。Pull解析器是一种事件驱动的解析方式,它不需要完整的XML文档加载到内存中,而是按需读取,降低了内存消耗。 首先,让我们理解...

    Android 封装pull解析xml

    本文将重点介绍SAX解析的一种实现方式——Pull解析。 Pull解析器(XMLPullParser)是Android SDK提供的一种轻量级、高效的XML解析方式,它不需要创建整个XML文档的树结构,而是通过事件触发的方式解析XML,从而节省...

    android的pull解析

    "android的pull解析"是指Android系统提供的一种轻量级、低内存占用的数据解析方式——XML Pull解析器。这种解析方式允许应用程序在XML文档中移动,读取和解析元素,而无需将整个文档加载到内存中。本文将深入探讨...

    使用Android自带的XML解析器PULL解析器简单的解析xml

    Android系统提供了一种轻量级的XML解析方式——PULL解析器(Pull Parser),它适用于处理大型XML文档,因为它不需要像DOM解析器那样一次性加载整个XML文档到内存中。PULL解析器通过事件驱动的方式,按需解析XML文档...

    android开发之xml文件操作——xml创建和pull解析xml

    本项目主要关注的是XML的创建和使用Pull解析器来解析XML,这是Android系统中处理XML数据的一种高效方法。接下来,我们将详细讨论这两个知识点。 首先,XML(Extensible Markup Language)是一种用于标记数据的语言...

    安卓Android源码——比较通用的xml解析方法.rar

    本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...

    安卓Android源码——ReadXmlByPull1.rar

    本压缩包“安卓Android源码——ReadXmlByPull1.rar”显然包含了关于如何在Android平台上使用Pull解析器读取XML的示例代码。Pull解析器是一种轻量级的XML解析方法,它不需要像SAX或DOM那样预先加载整个XML文档,而是...

    安卓Android源码——比较通用的xml解析方法.zip

    本压缩包文件"安卓Android源码——比较通用的xml解析方法.zip"可能包含了一些关于如何在Android系统中解析XML的通用方法和技术。以下是关于Android XML解析的一些关键知识点: 1. **DOM解析**: - DOM(Document ...

    安卓Android源码——ReadXmlByPull.rar

    "安卓Android源码——ReadXmlByPull.rar"这个压缩包很可能包含了一个使用Pull解析器读取XML的示例项目。Pull解析器是Android系统提供的一种轻量级、高效的XML解析方式,相比DOM和SAX,它更适合内存有限的移动设备。 ...

    Android应用源码之28.使用DOM和pull解析XML-IT计算机-毕业设计.zip

    总的来说,这份源码涵盖了Android开发中的核心技能之一——XML解析,无论是对DOM的深入理解还是对Pull解析的实践操作,都将对你的Android编程能力有显著提升。通过学习和研究,你不仅可以增强技术实力,还能为未来的...

    pull 解析 jar 包

    5. **Pull解析模式**:这里的"pull"可能指的是Android的XML解析库——`PullParser`。它提供了一种高效、低内存占用的方式来解析XML流,通过调用`next()`方法拉取下一个事件,而不是像DOM那样一次性加载整个文档。在...

    Android中数据解析的五种方式

    Android提供了一个基于事件的解析库——Pull解析器,其原理与SAX类似,但更轻量级且专为Android设计。通过创建`XmlPullParserFactory`,然后调用`newPullParser()`方法创建`XmlPullParser`,再设置解析事件监听器,...

    通过网络获取xml文件使用pull解析得到服务器中的信息(新闻客户端)

    Android提供了一种基于事件的解析方式——Pull解析器(XMLPullParser)。它不需要一次性加载整个XML文档到内存,而是逐行读取,节省了资源。首先,我们需要实例化XMLPullParser,并设置输入流: ```java ...

    Android应用源码之比较通用的xml解析方法.zip

    除了DOM和SAX,Android还提供了一个基于SAX的解析器——Pull解析器。Pull解析器是轻量级的,它允许开发者手动控制解析过程,通过调用`XmlPullParser`接口的方法来遍历XML文档。与SAX相比,Pull解析器更易于使用,...

    Android基础——XML数据的三种解析方式

    本篇文章将深入探讨XML在Android中的三种主要解析方式:DOM解析、SAX解析和Pull解析,帮助开发者更好地理解和运用这些方法。 1. DOM解析(Document Object Model) DOM解析器会将整个XML文档加载到内存中,形成一个...

Global site tag (gtag.js) - Google Analytics