PULL 的工作原理:

XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser.nextText()从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument事件。

类和接口  功能
XmlPullParser 该解析器是一个在org.xmlpull.v1中定义的解析功能的接口。
XmlSerializer 它是一个接口,定义了XML信息集的序列。
XmlPullParserFactory 这个类用于在XMPULL V1 API中创建XML Pull解析器。
XmlPullParserException 抛出单一的XML pull解析器相关的错误。

它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

读取到xml的声明返回 START_DOCUMENT

结束返回 END_DOCUMENT

开始标签返回 START_TAG

结束标签返回 END_TAG

示例:

MainActivity.java

package cn.lixyz.xmltest.activity;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import cn.lixyz.xmltest.R;
import cn.lixyz.xmltest.model.Student;
import cn.lixyz.xmltest.parser.DOMForXML;
import cn.lixyz.xmltest.parser.PULLForXML;
import cn.lixyz.xmltest.parser.SAXForXML; public class MainActivity extends Activity { private Button bt_readxml_dom, bt_writexml_dom, bt_writexml_sax, bt_readxml_sax, bt_readxml_pull, bt_writexml_pull; private List<Student> list; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); findView();
} private void findView() {
bt_readxml_dom = (Button) findViewById(R.id.bt_readxml_dom);
bt_writexml_dom = (Button) findViewById(R.id.bt_writexml_dom);
bt_writexml_sax = (Button) findViewById(R.id.bt_writexml_sax);
bt_readxml_sax = (Button) findViewById(R.id.bt_readxml_sax);
bt_readxml_pull = (Button) findViewById(R.id.bt_readxml_pull);
bt_writexml_pull = (Button) findViewById(R.id.bt_writexml_pull);
} public void clickButton(View view) {
DOMForXML domForXML;
SAXForXML saxForXML;
PULLForXML pullForXML;
switch (view.getId()) {
case R.id.bt_readxml_dom:
domForXML = new DOMForXML();
domForXML.domReadXML();
break; case R.id.bt_writexml_dom:
domForXML = new DOMForXML();
domForXML.domWriterXML();
break;
case R.id.bt_readxml_sax:
saxForXML = new SAXForXML();
saxForXML.saxReaderXML();
break;
case R.id.bt_writexml_sax:
saxForXML = new SAXForXML();
saxForXML.saxWriterXML();
break;
case R.id.bt_writexml_pull:
pullForXML = new PULLForXML();
pullForXML.pullWriterXML();
break;
case R.id.bt_readxml_pull:
pullForXML = new PULLForXML();
pullForXML.pullReaderXML();
break;
}
} }

activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="cn.lixyz.xmltest.activity.MainActivity" > <Button
android:id="@+id/bt_writexml_dom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickButton"
android:text="DOM方式生成XML" /> <Button
android:id="@+id/bt_readxml_dom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickButton"
android:text="DOM方式读取XML" /> <Button
android:id="@+id/bt_writexml_sax"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickButton"
android:text="SAX方式生成XML" /> <Button
android:id="@+id/bt_readxml_sax"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickButton"
android:text="SAX方式读取XML" /> <Button
android:id="@+id/bt_writexml_pull"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickButton"
android:text="PULL生成XML" /> <Button
android:id="@+id/bt_readxml_pull"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clickButton"
android:text="PULL解析XML" />
</LinearLayout> </ScrollView>

PULLForXML.java

package cn.lixyz.xmltest.parser;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer; import android.util.Log;
import android.util.Xml;
import cn.lixyz.xmltest.model.Student; public class PULLForXML { // pull生成xml文件
public void pullWriterXML() { //创建数据源
List<Student> listData = createStudents();
File fileFolder = new File("data/data/cn.lixyz.xmltest/files");
if (!fileFolder.exists()) {
fileFolder.mkdir();
Log.d("TTTT", "文件夹不存在,已经创建");
} FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream("data/data/cn.lixyz.xmltest/files/studentForPull.xml"); XmlSerializer xmlSerializer = Xml.newSerializer();
xmlSerializer.setOutput(fileOutputStream, "UTF-8"); xmlSerializer.startTag(null, "students"); for (Student student : listData) {
xmlSerializer.startTag(null, "student");
xmlSerializer.attribute("", "id", student.getId() + ""); xmlSerializer.startTag(null, "name");
xmlSerializer.text(student.getName());
xmlSerializer.endTag(null, "name"); xmlSerializer.startTag(null, "age");
xmlSerializer.text(student.getAge() + "");
xmlSerializer.endTag(null, "age");
xmlSerializer.endTag(null, "student");
}
xmlSerializer.endTag(null, "students");
xmlSerializer.endDocument();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // pull读取xml文件
public void pullReaderXML() {
List<Student> listData = null;
Student student = null; try {
FileInputStream fileInputStream = new FileInputStream(
new File("data/data/cn.lixyz.xmltest/files/studentForPull.xml"));
XmlPullParser xmlPullParser = Xml.newPullParser();
xmlPullParser.setInput(fileInputStream, "UTF-8"); int event = xmlPullParser.getEventType(); while (event != xmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
listData = new ArrayList<Student>();
break; case XmlPullParser.START_TAG:
if ("student".equals(xmlPullParser.getName())) {
student = new Student();
int id = Integer.parseInt(xmlPullParser.getAttributeValue(0));
student.setId(id);
} else if ("name".equals(xmlPullParser.getName())) {
String name = xmlPullParser.nextText();
student.setName(name);
} else if ("age".equals(xmlPullParser.getName())) {
int age = Integer.parseInt(xmlPullParser.nextText());
student.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if ("student".equals(xmlPullParser.getName())) {
listData.add(student);
}
}
event = xmlPullParser.next();
}
for (Student s : listData) {
Log.d("TTTT", s.getId() + "->" + s.getName() + "->" + s.getAge());
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} // 模拟生成xml的数据
private List<Student> createStudents() {
List<Student> listData = new ArrayList<Student>();
listData = new ArrayList<Student>();
Student s1 = new Student();
s1.setId(11);
s1.setName("张三");
s1.setAge(10);
listData.add(s1);
Student s2 = new Student();
s2.setId(22);
s2.setName("李四");
s2.setAge(11);
listData.add(s2);
Student s3 = new Student();
s3.setId(33);
s3.setName("王五");
s3.setAge(12);
listData.add(s3);
Student s4 = new Student();
s4.setId(44);
s4.setName("赵六");
s4.setAge(13);
listData.add(s4);
Student s5 = new Student();
s5.setId(55);
s5.setName("刘七");
s5.setAge(14);
listData.add(s5);
return listData;
}
}

Student.java

package cn.lixyz.xmltest.model;

public class Student {

    private int id;
private String name;
private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }

  

Android笔记(四十六) Android中的数据存储——XML(二)PULL解析的更多相关文章

  1. Android中的数据存储(二):文件存储 2017-05-25 08:16 35人阅读 评论(0) 收藏

    文件存储 这是本人(菜鸟)学习android数据存储时接触的有关文件存储的知识以及本人自己写的简单地demo,为初学者学习和使用文件存储提供一些帮助.. 如果有需要查看SharedPreference ...

  2. Android笔记(四十五) Android中的数据存储——XML(一)DOM解析器

    DOM解析XML在j2ee开发中比较常见,在Dom解析的过程中,是先把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式显然是一种比较消耗内存的方式,对于像手机这 ...

  3. Android笔记(四十七) Android中的数据存储——XML(三)SAX解析

    SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SA ...

  4. Android之旅十六 android中各种资源的使用

    android中各种资源的使用: 在android开发中,各种资源的合理使用应该在各自的xml中进行定义,以便反复使用; 字符串资源:strings.xml,xml中引用:@string/XXX,ja ...

  5. Android笔记(七十六) 点菜DEMO

    一个朋友让看一下他的代码,一个点菜的功能,他和我一样,初学者,代码比我的都混乱,也是醉了,干脆想着自己写个demo给他看,原本想着听简单,半个小时应该就可以搞定,真正写的时候,画了3h+,汗颜... ...

  6. Android笔记(七十五) Android中的图片压缩

    这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...

  7. Android笔记(十) Android中的布局——表格布局

    TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...

  8. Android笔记(十六) 简易计算器

    实现功能: 简单计算器 布局及美化 采用LinearLayout嵌套LinearLayout实现布局. 要求 1. 按钮所有文字居于右下角 2. 按钮为白色,点击变成橘色 3. 显示屏文字居右显示并且 ...

  9. 论文阅读笔记四十六:Feature Selective Anchor-Free Module for Single-Shot Object Detection(CVPR2019)

    论文原址:https://arxiv.org/abs/1903.00621 摘要 本文提出了基于无anchor机制的特征选择模块,是一个简单高效的单阶段组件,其可以结合特征金字塔嵌入到单阶段检测器中. ...

随机推荐

  1. Windows安装VMware并在VMware中安装Ubuntu

    安装 VMware 去官方下载 VMware 安装包,一路默认到底即可 VMware 安装Ubuntu 参考链接:VMware12安装虚拟机教程.Ubuntu16.04安装教程         VM1 ...

  2. matlab学习笔记11_2高维数组操作 squeeze,ind2sub, sub2ind

    一起来学matlab-matlab学习笔记11 11_2 高维数组处理和运算 squeeze, ind2sub, sub2ind 觉得有用的话,欢迎一起讨论相互学习~Follow Me squeeze ...

  3. [LeetCode] 129. Sum Root to Leaf Numbers 求根到叶节点数字之和

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  4. [LeetCode] 165. Compare Version Numbers 比较版本数

    Compare two version numbers version1 and version1.If version1 > version2 return 1, if version1 &l ...

  5. [LeetCode] 875. Koko Eating Bananas 可可吃香蕉

    Koko loves to eat bananas.  There are N piles of bananas, the i-th pile has piles[i] bananas.  The g ...

  6. 【Flume学习之二】Flume 使用场景

    环境 apache-flume-1.6.0 一.多agent连接 1.node101配置 option2 # Name the components on this agent a1.sources ...

  7. laravel相关知识点

    参考地址:http://note.youdao.com/noteshare?id=9899f8328427de449390230c35489934

  8. postman接口测试-参数化-测试数据Text文本

    全局变量参数化 在环境变量里面设置好参数,比如url=http://www.baidu.com 某一类型的BaseUrl全部都是www.baidu.com,参数化之后倘若哪天URL变更之后,改一个环境 ...

  9. STM32F030C8T6低功耗笔记

    2018年5月8日 这个芯片的低功耗搞了好久了,刚开始是7mA降不下去,然后是降到了1mA,到现在的200uA,还是有地方没有弄好,目标是降到50uA左右,目前遇到了问题,进入STOP模式的时候降到了 ...

  10. Oracle数据库常用语法

    基本 --新建表:create table table1( id varchar(300) primary key, name varchar(200) not null); --插入数据 inser ...