一.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对象

  1. XmlPullParser parser = Xml.newPullParser();
  2. parser.setInput(inputStream, "UTF-8");//设置事件源编码

2. 获取事件类型

  1. int eventType = parser.getEventType();

3. 获取文本内容

  1. //判断是否到结束节点
  2. while (eventType != XmlPullParser.END_DOCUMENT) {
  3. switch (eventType) {
  4. //文档开始事件,可以进行数据初始化处理
  5. case XmlPullParser.START_DOCUMENT:
  6. ...
  7. break;
  8.             //开始元素事件
  9. case XmlPullParser.START_TAG:
  10. ...
  11. break;
  12. //结束元素事件
  13. case XmlPullParser.END_TAG:
  14. ...
  15. break;
  16. }
  17. eventType = parser.next();
  18. }

调用parser.nextText()方法可以获取下一个Text类型元素的值。

三、PULL解析XML代码

1.创建一个XML文件itcase.xml,并将其放在res/raw文件夹下。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persons>
  3. <person id="23">
  4. <name>liming</name>
  5. <age>30</age>
  6. </person>
  7. <person id="20">
  8. <name>lixiangmei</name>
  9. <age>25</age>
  10. </person>
  11. </persons>

如果没有raw文件夹,就在res文件夹下创建一个raw文件夹,并创建xml文件。

2.修改视图
  1. <Button
  2. android:id="@+id/pull_button"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:layout_centerHorizontal="true"
  6. android:layout_marginTop="@dimen/fab_margin"
  7. android:gravity="center_horizontal"
  8. android:text="@string/PULL" />
  9. <TextView
  10. android:id="@+id/text"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:text="Hello World!" />
3.添加AnalyzePull类
  1. package com.zhangmiao.analyzexmldemo;
  2.  
  3. import android.util.Xml;
  4.  
  5. import org.xmlpull.v1.XmlPullParser;
  6. import org.xmlpull.v1.XmlSerializer;
  7.  
  8. import java.io.InputStream;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. /**
  13. * Created by zhangmiao on 2016/12/14.
  14. */
  15. public class AnalyzePull {
  16.  
  17. public static List<Person> readXML(InputStream inputStream) {
  18. XmlPullParser parser = Xml.newPullParser();
  19.  
  20. try {
  21. parser.setInput(inputStream, "UTF-8");
  22. int eventType = parser.getEventType();
  23.  
  24. Person currentPerson = null;
  25. List<Person> persons = null;
  26.  
  27. while (eventType != XmlPullParser.END_DOCUMENT) {
  28. switch (eventType) {
  29. case XmlPullParser.START_DOCUMENT:
  30. persons = new ArrayList<>();
  31. break;
  32. case XmlPullParser.START_TAG:
  33. String name = parser.getName();
  34. if (name.equalsIgnoreCase("person")) {
  35. currentPerson = new Person();
  36. currentPerson.setId(
  37. new Integer(parser.getAttributeValue(null, "id"))
  38. );
  39. } else if (currentPerson != null) {
  40. if (name.equalsIgnoreCase("name")) {
  41. currentPerson.setName(parser.nextText());
  42. } else if (name.equalsIgnoreCase("age")) {
  43. currentPerson.setAge(new Short(parser.nextText()));
  44. }
  45. }
  46. break;
  47. case XmlPullParser.END_TAG:
  48. if (parser.getName().equalsIgnoreCase("person")
  49. && currentPerson != null) {
  50. persons.add(currentPerson);
  51. currentPerson = null;
  52. }
  53. break;
  54. }
  55. eventType = parser.next();
  56. }
  57. inputStream.close();
  58. return persons;
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. }
  62. return null;
  63. }
  64. }
4.修改MainActivity类
  1. package com.zhangmiao.analyzexmldemo;
  2.  
  3. import android.os.Bundle;
  4. import android.support.design.widget.FloatingActionButton;
  5. import android.support.design.widget.Snackbar;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.support.v7.widget.Toolbar;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.view.Menu;
  11. import android.view.MenuItem;
  12. import android.widget.Button;
  13. import android.widget.TextView;
  14.  
  15. import org.xml.sax.InputSource;
  16.  
  17. import java.io.BufferedWriter;
  18. import java.io.File;
  19. import java.io.FileOutputStream;
  20. import java.io.InputStream;
  21. import java.io.OutputStreamWriter;
  22. import java.io.StringWriter;
  23. import java.util.List;
  24.  
  25. import javax.xml.parsers.SAXParser;
  26. import javax.xml.parsers.SAXParserFactory;
  27.  
  28. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  29.  
  30. private static final String TAG = "AnalyzeXMLDemo";
  31.  
  32. private TextView mTextView;
  33.  
  34. private InputStream inputStream;
  35.  
  36. @Override
  37. protected void onCreate(Bundle savedInstanceState) {
  38. Log.v(TAG, "onCreate");
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_main);
  41. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  42. setSupportActionBar(toolbar);
  43.  
  44. FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
  45. fab.setOnClickListener(new View.OnClickListener() {
  46. @Override
  47. public void onClick(View view) {
  48. Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
  49. .setAction("Action", null).show();
  50. }
  51. });
  52.  
  53. Button pullButton = (Button)findViewById(R.id.pull_button);
  54. mTextView = (TextView) findViewById(R.id.text);
  55.  
  56. pullButton.setOnClickListener(this);
  57. }
  58.  
  59. @Override
  60. public void onClick(View v) {
  61. String result = "";
  62. inputStream = getResources().openRawResource(R.raw.itcase);
  63. switch (v.getId()) {
  64. case R.id.pull_button:
  65. result += "--------- PULL ---------" + "\n";
  66. File xmlFile = new File("myitcast.xml");
  67. if (inputStream == null) {
  68. result = "inputStream is null";
  69. } else {
  70. List<Person> personList = AnalyzePull.readXML(inputStream);
  71. if (personList != null) {
  72. for (int i = 0; i < personList.size(); i++) {
  73. String message = "id = " + personList.get(i).getId() + " , name = " + personList.get(i).getName()
  74. + " , age = " + personList.get(i).getAge() + ".\n";
  75. result += message;
  76. }
  77. }
  78. }
  79. mTextView.setText(result);
  80. break;
  81. default:
  82. break;
  83. }
  84. }
  85.  
  86. @Override
  87. public boolean onCreateOptionsMenu(Menu menu) {
  88. // Inflate the menu; this adds items to the action bar if it is present.
  89. getMenuInflater().inflate(R.menu.menu_main, menu);
  90. return true;
  91. }
  92.  
  93. @Override
  94. public boolean onOptionsItemSelected(MenuItem item) {
  95. // Handle action bar item clicks here. The action bar will
  96. // automatically handle clicks on the Home/Up button, so long
  97. // as you specify a parent activity in AndroidManifest.xml.
  98. int id = item.getItemId();
  99.  
  100. //noinspection SimplifiableIfStatement
  101. if (id == R.id.action_settings) {
  102. return true;
  103. }
  104.  
  105. return super.onOptionsItemSelected(item);
  106. }
  107. }

参考文章:

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的更多相关文章

  1. Android中用PULL解析XML

    解析XML的方式有DOM,SAX,PULL,那为什么要在Android中使用PULL解析呢?首先来说一下PULL解析的优点,然后再说一下其他两种解析方式的缺点,答案就清晰可见啦. DOM不适合文档较大 ...

  2. Android使用pull解析xml

    一.理论准备     Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, ...

  3. android——使用pull解析xml文件

    1.persons.xml 将persons.xml文件放到src目录下.其代码如下: <?xml version='1.0' encoding='UTF-8' standalone='yes' ...

  4. [android] 采用pull解析xml文件

    /***********2016年5月6日 更新**********************/ 知乎:Android 中有哪几种解析 xml 的类,官方推荐哪种 ? 以及它们的原理和区别? 刘吉财: ...

  5. Android中pull解析XML文件的简单使用

    首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐 ...

  6. Android使用pull解析xml格式的数据

    dom解析:基于全文加载的解析方式   sax解析:基于事件的逐行解析方式  pull解析:同sax              XmlPullParser     //解析xml文件读取短信内容    ...

  7. 使用PULL解析XML文件

    转载博文1:http://blog.csdn.net/wangkuifeng0118/article/details/7313241 XmlPull和Sax类似,是基于流(stream)操作文件,然后 ...

  8. Android——PULL解析XML

    简介 Android中常常使用XML文件保存用户的APP设置信息.因此需要对XML文件的相关操作进行了解.本文将以<学生信息管理系统>为案例背景进行介绍相关的XML解析的介绍,以及其他相关 ...

  9. Android系列--DOM、SAX、Pull解析XML

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

随机推荐

  1. 【.net 深呼吸】细说CodeDom(8):分支与循环

    有人会问,为啥 CodeDom 不会生成 switch 语句,为啥没生成 while 语句之类.要注意,CodeDom只关心代码逻辑,而不是语法,语法是给写代码的人用的.如果用.net的“反编译”工具 ...

  2. Appium移动自动化框架

    引言:Appium 是一个移动端自动化测试开源工具,可以针对不同的平台用一套API来编写测试用例.本文对Appium自动化测试框架的功能进行了概括. 本文选自<软件自动化测试开发>. Ap ...

  3. MFC中如何画带实心箭头的直线

    工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决:思路如下: (1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度 (2)以P2为原点得到向量P2P1 ...

  4. AJAX实现登录界面

    使用php跳转界面和AJAX都可实现登录界面的跳转的登录失败对的提醒.但是,php跳转的方式 需要额外加载其他界面,用户体验差.AJAX可实现当前页面只刷新需要的数据,不对当前网页进行 重新加载或者是 ...

  5. vue.js初探

    前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...

  6. VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答

    用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...

  7. Spring(三)__aop编程

    aop( aspect oriented programming ) 面向切面编程,是对所有对象或者是一类对象编程 几个重要的概念: 1.切面(aspect):要实现的交叉功能,是系统模块化的一个切面 ...

  8. CRM 数据密钥 忘记 解决方案

    UPDATE EmailServerProfile SET IncomingPassword=nullUPDATE EmailServerProfile SET OutgoingPassword=nu ...

  9. Android studio使用gradle动态构建APP(不同的包,不同的icon、label)

    最近有个需求,需要做两个功能相似的APP,大部分代码是一样的,只是界面不一样,以前要维护两套代码,比较麻烦,最近在网上找资料,发现可以用gradle使用同一套代码构建两个APP.下面介绍使用方法: 首 ...

  10. 【一起学OpenFoam】02 软件准备

    "工欲善其事必先利其器",在利用OpenFoam解决我们的工程问题之前,首先要做的事情是搭建一个OpenFoam运行环境.很遗憾的是,OpenFoam的原生开发系统是Linux,因 ...