Android(java)学习笔记130:Android中操作XML数据(使用Pull解析器)
1. Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
解析如下xml文件:
<?xml version="1.0" encoding="UTF-8" ?> 文档开头 0
<student> 开始标签 2
<name> 开始标签 2
zhangsan 文本标签 4
</name> 结束标签 3
<num> 开始标签 2
10001 文本标签 4
</num> 结束标签 3
<sex> 开始标签 2
male 文本标签 4
</sex> 结束标签 3
</student> 结束标签 3
文档结束 1
XmlSerializer serializer = Xml.newSerializer(); // Xml序列化生成器
XmlPullParser parser = Xml.newPullParser(); // Pull解析器
2. 案例学生管理系统
(1)首先我们看看这个activity_main.xml文件:
<LinearLayout 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"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingLeft="10dip"
android:paddingRight="10dip"
tools:context=".MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="学生信息管理系统"
android:textColor="#99ff0000"
android:textSize="20sp" /> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="姓名"
android:textColor="#9900ff00"
android:textSize="14sp" /> <EditText
android:id="@+id/et_name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入姓名"
android:inputType="text" /> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="学号"
android:textColor="#9900ff00"
android:textSize="14sp" /> <EditText
android:id="@+id/et_num"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入学号"
android:inputType="number" /> <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="性别"
android:textColor="#9900ff00"
android:textSize="14sp" /> <RadioGroup
android:id="@+id/rg_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" > <RadioButton
android:id="@+id/rb_male"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="男" /> <RadioButton
android:id="@+id/rb_female"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女" />
</RadioGroup> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <ScrollView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" > <LinearLayout
android:id="@+id/ll_result"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:orientation="vertical" >
</LinearLayout>
</ScrollView> <Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="save"
android:text="保存" />
</LinearLayout> </LinearLayout>
(2)MainActivity.java:
package com.itheima.studentinfo; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream; import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer; import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Xml;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity {
private EditText et_name;
private EditText et_num;
private RadioGroup rg_sex; //显示结果的页面
private LinearLayout ll_result; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//界面无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
et_num = (EditText) findViewById(R.id.et_num);
rg_sex = (RadioGroup) findViewById(R.id.rg_sex);
ll_result = (LinearLayout) findViewById(R.id.ll_result);
refreshData(); } //刷新数据
private void refreshData() {
//清除旧的全部的数据
ll_result.removeAllViews();
//解析已经存在的xml文件,把里面的数据全部都获取出来,添加上到界面上
File files = getFilesDir();
for(File file :files.listFiles()){
//每个文件都是一个xml
//解析xml
readXmlInfo(file);
}
} /**
* 点击保存学生的信息,生成一个xml文件
* @param view
*/
public void save(View view){
String name = et_name.getText().toString().trim();
String num = et_num.getText().toString().trim();
if(TextUtils.isEmpty(num)||TextUtils.isEmpty(name)){
Toast.makeText(this, "学生姓名或者学号不能为空", 0).show();
return ;
}
try {
File file = new File(getFilesDir(),num+".xml");
FileOutputStream os = new FileOutputStream(file);
//采用谷歌api 生成xml文件
//1.获取一个xml文件的生成器,序列化器
XmlSerializer serializer = Xml.newSerializer();
//2.初始化序列化器 设置写到哪个文件,采用什么样的编码方式
serializer.setOutput(os, "utf-8");
//3.开始写数据 ,写xml文件头,文档为独立的xml文件
serializer.startDocument("utf-8", true);
serializer.startTag(null, "student");
serializer.startTag(null, "name");
serializer.text(name);
serializer.endTag(null, "name");
serializer.startTag(null, "num");
serializer.text(num);
serializer.endTag(null, "num");
serializer.startTag(null, "sex");
if(rg_sex.getCheckedRadioButtonId()==R.id.rb_male){
serializer.text("male");
}else{
serializer.text("female");
}
serializer.endTag(null, "sex");
serializer.endTag(null, "student");
serializer.endDocument();
os.close();
Toast.makeText(this, "保存数据成功", 0).show();
refreshData();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "保存数据失败", 0).show();
}
} private void readXmlInfo(File file){
try {
//1.初始化解析器
XmlPullParser parser = Xml.newPullParser();
//2.设置解析器的参数
InputStream inputStream = new FileInputStream(file);
parser.setInput(inputStream, "utf-8");
int type = parser.getEventType();
StringBuilder sb = new StringBuilder();
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
if("name".equals(parser.getName())){
//这是name节点
String name = parser.nextText();
sb.append("--name:"+name);
}else if("num".equals(parser.getName())){
//这是name节点
String num = parser.nextText();
sb.append("--num:"+num);
}else if("sex".equals(parser.getName())){
//这是name节点
String sex = parser.nextText();
sb.append("--sex:"+sex);
}
break;
}
type = parser.next();//让解析器解析下一个元素
}
inputStream.close();
String text = sb.toString();
TextView tv = new TextView(this);
tv.setText(text);
ll_result.addView(tv);
} catch (Exception e) {
e.printStackTrace();
TextView tv = new TextView(this);
tv.setText("这条数据无效");
ll_result.addView(tv);
}
} }
pull解析xml文件的步骤:
1. 初始化一个xml的Pull解析器
XmlPullParser parser = Xml.newPullParser();
2. 设置解析器的参数
InputStream inputStream = this.getAssets().open("10001.xml");//这里使用资产文件举例说明而已
parser.setInput(inputStream, "utf-8");
3. 读数据
效果图如下:
这是在真机上面运行的,这些xml数据保存在:
我们随便打开一个100017.xml文件如下:
注意:(1)刷新数据,代码如下:
private void refreshData(){
//清除旧的全部的数据
ll_result.removeAllViews(); //必须先删除之前所有数据,不然的会出现数据大量重复出现
//解析已经存在的xml文件,把里面的数据全部都获取出来,添加上到界面上
File files = getFilesDir();
for(File file :files.listFiles()){//每个文件都是一个xml
//解析xml
readXmlInfo(file);
}
}
(2)动态设置LinearLayout的布局元素:
ll_result = (LinearLayout) findViewById(R.id.ll_result);
……
TextView tv = new TextView(this);
tv.setText(text);
ll_result.addView(tv);//动态添加TextView
Android(java)学习笔记130:Android中操作XML数据(使用Pull解析器)的更多相关文章
- Android:日常学习笔记(10)———使用LitePal操作数据库
Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...
- Java学习笔记:基本输入、输出数据操作实例分析
Java学习笔记:基本输入.输出数据操作.分享给大家供大家参考,具体如下: 相关内容: 输出数据: print println printf 输入数据: Scanner 输出数据: JAVA中在屏幕中 ...
- Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)
1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...
- Android开发学习笔记-关于Android的消息推送以及前后台切换
下面是最简单的Android的消息推送的实现方法 package com.example.shownotic; import java.util.Random; import android.supp ...
- 10.3(Java学习笔记)JDBC时间操作
一.时间分类 数据库 java类 Date ---- java.sql.Date 表示日期 yyyy-MM--dd (年月日) Time ----java.sql.Time 表示 ...
- Java学习笔记(十三一)——Xml 常用知识总结
[前面的话] 在学习spring框架,发现很多地方都用到了Xml的知识,所以会过头来再学习学习Xml. 本章学习的是Xml的基础,所以基础性文章,选择性阅读. [Xml] 一.Xml初步了解 XML ...
- Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法
在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...
- Java学习笔记七(目录操作)
1.介绍 上一篇博客介绍的是java中经常使用的操作文件的方式,本篇博客着重解说一下,在Java中是怎样来操作目录的.主要是利用的是Java.IO包以下的File类,本篇博客着重解说一下该类的构造函数 ...
- Java学习笔记40(sql:将数据库内数据存入对象中)
新建一个数据表: use qy97; create table student( id int primary key auto_increment, sname ), gander ), age i ...
随机推荐
- spring-boot-starter-data-redis学习笔记01
1.Redis在Unbuntu14开启, 进入安装的src目录: 1.修改redis.conf,因为redis默认是受保护模式. protected-mode yes (改为no) bind 12 ...
- 如何让div中的span垂直居中 ----height:100%设置div的高度
如果div中只有一个span一个元素,可以使用line-height.如果div中还有其他元素,可以设置span的css如下: .span{ position: absolute; top: 50%; ...
- Git 时光穿梭鸡 删除文件 以及批量删除文件
先添加一个新文件test.txt到Git并且提交: 一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了 $ rm test.txt 这个时候,Git知道你删除了文件, 因此,工作 ...
- elasticsearch学习(三):分布式
es的分布式思想跟现在流行的很多开发技术的分布式一个道理.一个es 搜索服务作为一个集群,集群中存在很多节点,一个节点就是一个搜索服务器.这么多节点中,会按照一定的机制推举出一个 master节点,该 ...
- 洛谷P2134 百日旅行
P2134 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.——小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场大考时默 ...
- 前端面试题整理---JS基础
为了督促自己学习,整理了一下前端的面试题 JavaScript: JavaScript 中如何监测一个变量是String类型? typeof(obj)==="string"; ty ...
- 求n位水仙花数
求n位水仙花数 A.两个关键 1.n位水仙花数的范围是什么? n位水仙花数的范围是[10n-1,10n) 2.如何判断是否为水仙花数 核心操作: 2-1.如何得到每一位? A.核心思想 对得到的数进行 ...
- 深入V8引擎-Time模块介绍
积跬步,行千里,先从最简单的开始写. 这一篇介绍V8中的时间模块,与libuv粗糙的update_loop_time方法不同,V8有一套独立完整的类负责管理时间. 该类位于src/base/platf ...
- BZOJ 2288: 【POJ Challenge】生日礼物 堆&&链表
就是堆+链表,十分像 数据备份 对吧? 把相邻的正数和相邻的负数合并成一整个正数块和负数块,最后只剩一些交替相间的正块与负块了吧? 显然,正块的个数<=m时,全部选走就获得了最大权值,否则我们可 ...
- uoj207共价大爷游长沙
话说我可能还没有调出魔法森林呢...说好的lct第一题呢... 又是一个随机化的方法,毕竟又是判定性的问题 上次是判断无向图联通 这次是判断一些路径是否经过一条定边 若把路径上的边全部异或上一个路径的 ...