安卓开发-xml的序列化和解析实例
以学生的信息保存和读取为例
public class MainActivity extends AppCompatActivity {
private EditText et_name;
private EditText et_number;
private RadioGroup rg_sex;
private TextView result;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
et_number = (EditText) findViewById(R.id.et_number);
rg_sex = (RadioGroup) findViewById(R.id.rg);
result=(TextView)findViewById(R.id.result);
}
序列化
public void saveinfo(View view){
//创建序列化器
XmlSerializer serializer= Xml.newSerializer();
//初始化
String name=et_name.getText().toString().trim();
String number=et_number.getText().toString().trim();
int id=rg_sex.getCheckedRadioButtonId();
String sex="male";
if (id == R.id.rg_female){
sex="female";
}else {
sex="male";
}
File file=new File(getFilesDir(),name+".xml");
try{
FileOutputStream fos=new FileOutputStream(file);
serializer.setOutput(fos,"utf-8");
//开始头文件
serializer.startDocument("utf-8",true);
serializer.startTag(null,"name");
serializer.text(name);
serializer.endTag(null,"name");
serializer.startTag(null,"number");
serializer.text(number);
serializer.endTag(null,"number");
serializer.startTag(null,"sex");
serializer.text(sex);
serializer.endTag(null,"sex");
serializer.endDocument();
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
}catch (Exception e){
e.printStackTrace();
Toast.makeText(this,"保存失败",Toast.LENGTH_SHORT).show();
}
}
解析
public void readinfo(View view){
//判断输入的学生名字是否存在
String name=et_name.getText().toString().trim();
if (TextUtils.isEmpty(name)){
Toast.makeText(MainActivity.this,"请输入姓名",Toast.LENGTH_SHORT).show();
System.out.print("gggggggggg");
return;
}
//读取该学生的信息文件
File file=new File(getFilesDir(),name+".xml");
StringBuilder sb=new StringBuilder();
if (file.exists()||file.length()>0){
//信息文件存在,开始解析
//1.建解析器
XmlPullParser parser=Xml.newPullParser();
//2.设置参数
try{
FileInputStream fis=new FileInputStream(file);
parser.setInput(fis,"utf-8");
//3.开始解析
//获取当前事件类型,也就是第一个
int type=parser.getEventType();
while (type!=XmlPullParser.END_DOCUMENT){//当事件类型不等于END_DOCUMENT就代表没有结束,继续循环
if (type==XmlPullParser.START_TAG){//循环的时候如果type的类型等于START_TAG,再判断节点名字是否是等于需要提取的节点名
if ("name".equals(parser.getName())){
String n=parser.nextText();
sb.append("name:"+n+"\n");
}else if ("number".equals(parser.getName())){
String num=parser.nextText();
sb.append("number:"+num+"\n");
}else if ("sex".equals(parser.getName())){
String s=parser.nextText();
sb.append("sex:"+s+"\n");
}
}
//获取之后吧type的值赋给下一个事件类型
type=parser.next();//获取下一个事件类型
result.setText(sb.toString());
}
fis.close();
}catch (Exception e){
Toast.makeText(MainActivity.this,"读取失败",Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
else {
Toast.makeText(MainActivity.this,"没这人",Toast.LENGTH_SHORT).show();
}
}
}