Android之Pull解析XML
一.Pull解析方法介绍
除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件。Pull解析器的运行方式与SAX解析器相似。它也是事件触发的。Pull解析方式让应用程序完全控制文档该怎么样被解析。比如开始和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。通过Parser.getEventType()方法来取得事件的代码值,解析是在开始时就完成了大部分的处理。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。Pull解析是一个遍历文档的过程,每次调用next()、nextTag()、nextToken()和nextText()都会向前推进文档,并使parser停留在某些事件上面,但是不能倒退。然后把文档设置给Parser。它允许用户的应用程序代码从解析器中获取事件,这与SAX解析器自动将事件推入处理程序相反。Pull解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用Pull解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。
SAX与Pull的区别:SAX解析器的工作方式是自动将事件处理器进行处理,因此不能控制事件的处理主动结束;而Pull解析器的工作方式为允许应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。
优点: 解析速度快,占用资源少。
缺点: 数据不持久。
使用场合: 对于XML文档较大但只需要文档的一部分。
二、PULL解析步骤
1. 构建一个XmlPullParser对象
- XmlPullParser parser = Xml.newPullParser();
- parser.setInput(inputStream, "UTF-8");//设置事件源编码
2. 获取事件类型
- int eventType = parser.getEventType();
3. 获取文本内容
- //判断是否到结束节点
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- //文档开始事件,可以进行数据初始化处理
- case XmlPullParser.START_DOCUMENT:
- ...
- break;
- //开始元素事件
- case XmlPullParser.START_TAG:
- ...
- break;
- //结束元素事件
- case XmlPullParser.END_TAG:
- ...
- break;
- }
- eventType = parser.next();
- }
调用parser.nextText()方法可以获取下一个Text类型元素的值。
三、PULL解析XML代码
1.创建一个XML文件itcase.xml,并将其放在res/raw文件夹下。
- <?xml version="1.0" encoding="UTF-8"?>
- <persons>
- <person id="23">
- <name>liming</name>
- <age>30</age>
- </person>
- <person id="20">
- <name>lixiangmei</name>
- <age>25</age>
- </person>
- </persons>
如果没有raw文件夹,就在res文件夹下创建一个raw文件夹,并创建xml文件。
2.修改视图
- <Button
- android:id="@+id/pull_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="@dimen/fab_margin"
- android:gravity="center_horizontal"
- android:text="@string/PULL" />
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hello World!" />
3.添加AnalyzePull类
- package com.zhangmiao.analyzexmldemo;
- import android.util.Xml;
- import org.xmlpull.v1.XmlPullParser;
- import org.xmlpull.v1.XmlSerializer;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * Created by zhangmiao on 2016/12/14.
- */
- public class AnalyzePull {
- public static List<Person> readXML(InputStream inputStream) {
- XmlPullParser parser = Xml.newPullParser();
- try {
- parser.setInput(inputStream, "UTF-8");
- int eventType = parser.getEventType();
- Person currentPerson = null;
- List<Person> persons = null;
- while (eventType != XmlPullParser.END_DOCUMENT) {
- switch (eventType) {
- case XmlPullParser.START_DOCUMENT:
- persons = new ArrayList<>();
- break;
- case XmlPullParser.START_TAG:
- String name = parser.getName();
- if (name.equalsIgnoreCase("person")) {
- currentPerson = new Person();
- currentPerson.setId(
- new Integer(parser.getAttributeValue(null, "id"))
- );
- } else if (currentPerson != null) {
- if (name.equalsIgnoreCase("name")) {
- currentPerson.setName(parser.nextText());
- } else if (name.equalsIgnoreCase("age")) {
- currentPerson.setAge(new Short(parser.nextText()));
- }
- }
- break;
- case XmlPullParser.END_TAG:
- if (parser.getName().equalsIgnoreCase("person")
- && currentPerson != null) {
- persons.add(currentPerson);
- currentPerson = null;
- }
- break;
- }
- eventType = parser.next();
- }
- inputStream.close();
- return persons;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- }
4.修改MainActivity类
- package com.zhangmiao.analyzexmldemo;
- import android.os.Bundle;
- import android.support.design.widget.FloatingActionButton;
- import android.support.design.widget.Snackbar;
- import android.support.v7.app.AppCompatActivity;
- import android.support.v7.widget.Toolbar;
- import android.util.Log;
- import android.view.View;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.widget.Button;
- import android.widget.TextView;
- import org.xml.sax.InputSource;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStreamWriter;
- import java.io.StringWriter;
- import java.util.List;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- public class MainActivity extends AppCompatActivity implements View.OnClickListener {
- private static final String TAG = "AnalyzeXMLDemo";
- private TextView mTextView;
- private InputStream inputStream;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- Log.v(TAG, "onCreate");
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
- setSupportActionBar(toolbar);
- FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
- fab.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
- .setAction("Action", null).show();
- }
- });
- Button pullButton = (Button)findViewById(R.id.pull_button);
- mTextView = (TextView) findViewById(R.id.text);
- pullButton.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- String result = "";
- inputStream = getResources().openRawResource(R.raw.itcase);
- switch (v.getId()) {
- case R.id.pull_button:
- result += "--------- PULL ---------" + "\n";
- File xmlFile = new File("myitcast.xml");
- if (inputStream == null) {
- result = "inputStream is null";
- } else {
- List<Person> personList = AnalyzePull.readXML(inputStream);
- if (personList != null) {
- for (int i = 0; i < personList.size(); i++) {
- String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()
- + " , age = " + personList.get(i).getAge() + ".\n";
- result += message;
- }
- }
- }
- mTextView.setText(result);
- break;
- default:
- break;
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- //noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- }
参考文章:
http://www.open-open.com/lib/view/open1392780226397.html
http://www.cnblogs.com/weixing/archive/2013/08/07/3243366.html
http://www.tuicool.com/articles/IvQvyq
Android之Pull解析XML的更多相关文章
- Android中用PULL解析XML
解析XML的方式有DOM,SAX,PULL,那为什么要在Android中使用PULL解析呢?首先来说一下PULL解析的优点,然后再说一下其他两种解析方式的缺点,答案就清晰可见啦. DOM不适合文档较大 ...
- Android使用pull解析xml
一.理论准备 Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, ...
- android——使用pull解析xml文件
1.persons.xml 将persons.xml文件放到src目录下.其代码如下: <?xml version='1.0' encoding='UTF-8' standalone='yes' ...
- [android] 采用pull解析xml文件
/***********2016年5月6日 更新**********************/ 知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别? 刘吉财: ...
- Android中pull解析XML文件的简单使用
首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐 ...
- Android使用pull解析xml格式的数据
dom解析:基于全文加载的解析方式 sax解析:基于事件的逐行解析方式 pull解析:同sax XmlPullParser //解析xml文件读取短信内容 ...
- 使用PULL解析XML文件
转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241 XmlPull和Sax类似,是基于流(stream)操作文件,然后 ...
- Android——PULL解析XML
简介 Android中常常使用XML文件保存用户的APP设置信息.因此需要对XML文件的相关操作进行了解.本文将以<学生信息管理系统>为案例背景进行介绍相关的XML解析的介绍,以及其他相关 ...
- Android系列--DOM、SAX、Pull解析XML
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
随机推荐
- 【.net 深呼吸】细说CodeDom(8):分支与循环
有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...
- Appium移动自动化框架
引言:Appium 是一个移动端自动化测试开源工具,可以针对不同的平台用一套API来编写测试用例.本文对Appium自动化测试框架的功能进行了概括. 本文选自<软件自动化测试开发>. Ap ...
- MFC中如何画带实心箭头的直线
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...
- AJAX实现登录界面
使用php跳转界面和AJAX都可实现登录界面的跳转的登录失败对的提醒.但是,php跳转的方式 需要额外加载其他界面,用户体验差.AJAX可实现当前页面只刷新需要的数据,不对当前网页进行 重新加载或者是 ...
- vue.js初探
前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...
- VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答
用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...
- Spring(三)__aop编程
aop( aspect oriented programming ) 面向切面编程,是对所有对象或者是一类对象编程 几个重要的概念: 1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面 ...
- CRM 数据密钥 忘记 解决方案
UPDATE EmailServerProfile SET IncomingPassword=nullUPDATE EmailServerProfile SET OutgoingPassword=nu ...
- Android studio使用gradle动态构建APP(不同的包,不同的icon、label)
最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...
- 【一起学OpenFoam】02 软件准备
"工欲善其事必先利其器",在利用OpenFoam解决我们的工程问题之前,首先要做的事情是搭建一个OpenFoam运行环境.很遗憾的是,OpenFoam的原生开发系统是Linux,因 ...