Android(java)学习笔记185:xml文件生成
1.xml文件:
用元素描述数据,跨平台。
2.利用传统的方式创建xml文件,下面是一个案例:
设计思路:建立一个学生管理系统,创建xml文件保存学生信息;

(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> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" > <Button
android:onClick="save"
android:layout_alignParentBottom="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="保存" />
</RelativeLayout> </LinearLayout>
效果图:

(2)逻辑核心代码如下:MainActivity.java:
package com.itheima.studentinfo; import java.io.File;
import java.io.FileOutputStream; import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast; public class MainActivity extends Activity {
private EditText et_name;
private EditText et_num;
private RadioGroup rg_sex; @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);
} /**
* 点击保存学生的信息,生成一个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 fos = new FileOutputStream(file);
StringBuilder sb = new StringBuilder();
//传统地建立xml文件
sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
sb.append("<student>");
sb.append("<name>");
sb.append(name);
sb.append("</name>");
sb.append("<num>");
sb.append(num);
sb.append("</num>");
sb.append("<sex>");
int id = rg_sex.getCheckedRadioButtonId();
if(id==R.id.rb_male){//男
sb.append("male");
}else{//女
sb.append("female");
}
sb.append("</sex>");
sb.append("</student>"); fos.write(sb.toString().getBytes());
fos.close();
Toast.makeText(this, "保存数据成功", 0).show();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "保存数据失败", 0).show();
}
} }
运行代码布署到模拟器上,然后我们在/data/data/com.itheima.studentinfo/files目录下,找到了10001.xml文件如下图:

把10001.xml文件导出到电脑上,使用浏览器打开如下图:

上面是建立xml文件比较传统的方法,但是输入姓名 、学号等信息的时候,我们不能包含非法字符,比如“ /”、“ < ”等等类似,所以上面代码还是有缺陷的。如下图:

使用浏览器打开生成的10002.xml文件报如下错误:

很明显上面传统的xml文件的创建方式是具有很大局限性,但是google的api提供很方便的接口生成xml文件,而且不用考虑这些非法字符,所以很方便安全,下面就介绍:
3.利用google提供API创建xml文件,修改上面的代码如下,这一次我们布署程序到真机中:
package com.itheima.studentinfo; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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);
}
} }
序列化器:是将内存写入到文件中
##生成xml文件的步骤
(1). 初始化一个xml的序列化器
XmlSerializer serializer = Xml.newSerializer();
(2). 设置序列化器的参数
serializer.setOutput(os, "utf-8");
(3). 写数据
serializer.startDocument("utf-8", true); 写文档头
serializer.endDocument();写文档末尾
serializer.startTag(命名空间,数据);写某个标签
serializer.endTag(null, "num");
serializer.text()写文本数据
如下:
serializer.startDocument("utf-8", true);//xml文件开始
serializer.startTag(null, "student");//节点开始标签:<student>
serializer.startTag(null, "name");//节点开始标签:<name>
serializer.text(name);
serializer.endTag(null, "name");//节点结束标签:</name>
serializer.startTag(null, "num");//节点开始标签:<num>
serializer.text(num);
serializer.endTag(null, "num");//节点结束标签:</num>
serializer.startTag(null, "sex");//节点开始标签:<sex>
if(rg_sex.getCheckedRadioButtonId()==R.id.rb_male){
serializer.text("male");
}else{
serializer.text("female");
}
serializer.endTag(null, "sex");//节点结束标签:</sex>
serializer.endTag(null, "student");//节点结束标签:</student>
serializer.endDocument();//xml文件结束
os.close();//关闭流
4.刚刚在3中我们生成了xml文件,接下来当然是如何使用面向对象的思想解析这些xml文件:
(1)sax 基于事件
(2)dom & dom4j 把xml文件加载到内存中
(3)pull解析(类似于sax但是效率更高,内存开销更小),Android中常用的xml解析方法。
Android(java)学习笔记185:xml文件生成的更多相关文章
- JAVA学习笔记 -- 读写XML
XML是一种可扩展标记语言 以下是一个完整的XML文件(也是下文介绍读写XML的样本): <? xml version="1.0" encoding="UTF-8& ...
- 学习笔记-解析xml文件
1. Dom4J <students> <student> <name>吴飞</name> <c ...
- Struts2 学习笔记——struts.xml文件之Bean的配置
Struts2的大部分核心组件不是以硬编码的形式写在代码中,而是通过自身的IoC容器来管理的. Struts2以可配置的形式来管理核心组件,所以开发者可以很容易的扩展框架的核心组件.当开发者需要扩展或 ...
- Java学习笔记--字符串和文件IO
1.Java中的字符串类和字符的表示 2.区分String,StringBuilder和StringBuffer 3.从命令行中给main方法传递参数 4.文件操作 1 Java中的字符串和字符 1. ...
- Java学习笔记-基础语法Ⅸ-文件
File File是文件和路径名的抽象表示,File封装的并不是一个真正存在的文件,是一个路径名,可以存在也可以不存在 常用方法: 创建文件:createNewFile() 创建目录:mkdir() ...
- JAVA学习笔记 -- 包资源文件jar包裹
初学者GUI,使用Eclipse出口jar包裹,不能显示最小化的图标集(hello.png根文件下的项目文件夹文件).码如下面: import javax.swing.JFrame; import j ...
- Java学习笔记——Socket实现文件传输
我越是逃离,却越是靠近你. 我越是背过脸,却越是看见你. 我从你开始, 我在你结束. 需求:实现局域网下socket传输文件. 客户端步骤: 1.建立与服务器的连接 2.创建client输出流 3.创 ...
- java学习笔记之基础篇
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
随机推荐
- 最简单的CRC32源码-查表法
这个算法是在逐BYTE法的基础上进行修改的,在上一篇文章里我们说过,如果不查表的话,逐BYTE法和逐BIT法没什么区别,现在我们就把这个算法写出来,注意在调用CRC校验函数前需要先调用表生成函数: u ...
- 【简译】JavaScript闭包导致的闭合变量问题以及解决方法
本文是翻译此文 预先阅读此文:闭合循环变量时被认为有害的(closing over the loop variable considered harmful) JavaScript也有同样的问题.考虑 ...
- perl 监控mysql 事务和锁
use DBI; use Net::SMTP; use HTTP::Date qw(time2iso str2time time2iso time2isoz); # mail_user should ...
- mysql 限制并发select patch
限制并发select的patch,代码量很少,主要是为了学习mysql的源码,yy一下. 增加两个全局控制变量: thread_limit_min thread_limit_max 增加一个条件变量: ...
- oracle热点表online rename
对于在线的繁忙业务表的任何操作都可能带来意想不到的风险.一张业务表,对partition key进行升位,其步骤是: rename原表 新建临时表 交换分区到临时表 升位临时表的字段的长度 交换临时表 ...
- Set up JBPM5.4 Final Installer to use MS SQL Server 2008 using JTDS(转)
[-] A What I Am Going To Do B The Setup Steps C Lets Install it A. What I Am Going To Do B. The Se ...
- 替换SQL Server字段中的换行符,回车符
replace(string_expression , string_pattern , string_replacement) 第一个参数:要查找的字段. 第二个参数:要查找的字符. 第三个参数:要 ...
- 遍历form表单
//表单 var form = new Ext.form.FormPanel({ //创建表单面板 labelAlign: 'center', //水平对齐方式 layout: 'form', //布 ...
- t-sql 中between and 的一种写法
t-sql 中between and 的一种写法: where GETDATE() BETWEEN BeginDateTime AND EndDateTime; BeginDateTime,EndDa ...
- $(function(){})里面不能声明定义函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...