XML文件的创建与解析

xml文件

一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义, 当另一方收到数据消息之后就可以按照相同的

结构规格进行解析,从而取出他想要的那部分内容,在网络上传输数据时最常用的格式有两种,XML 和 JSON。目前先大概总结下xml文件的创建与解析。

第一,创建方法,步骤如下:

1,获取序列化器 XmlSerializer serializer = Xml.newSerializer();

2,初始化序列化器 serializer.setOutput(os, "utf-8");

3,按照一定的格式写入数据,其格式图片示例如下所示:

image_thumb6

serializer.startDocument("utf-8", true); 写文档头 包括编码

serializer.startTag(命名空间,数据);写开始标签

serializer.text(); 写文本数据

serializer.endTag(null, "num"); 写结束标签

serializer.endDocument();写文档末尾

实际操作如下:

image_thumb10

4,关闭数据流 os.close

第二,解析方法,步骤如下:

通常解析方法有pull解析和sax解析,先来学习下pull解析方法,类似于sax解析,但是效率更高,内存开销更小;解析与创建是个逆过程,所以类似:

1, 创建解析器 XmlPullParser parser = Xml.newPullParser();

2,初始化解析器

InputStream inputStream = this.getAssets().open("10001.xml"); //打开目标文件xml

parser.setInput(inputStream, "utf-8"); //初始化

3,解析数据

第一步,获取事件的类型 int type=parser.getEventType();

第二步,while循环以及switch语句判断获取事件类型,

while (type!=XmlPullParser.END_DOCUMENT){

switch (type) {
case XmlPullParser.START_TAG:
if ("name".equals(parser.getName())) { //这是姓名节点
String name=parser.nextText();
sb.append("姓名"+name);
} else if("num".equals(parser.getText())) {//这是学号节点
String num=parser.nextText();
sb.append("学号"+num);
}
break;
}

type = parser.next();//让解析器解析下一个元素

}

image_thumb13

用xml存储和解析的小案例,学生管理系统

(心得,写代码一定要细心,绝对不能粗心,不说能大概就可以了,不然会埋下好多隐患。。bug。。。,比如大小写,代码提示选错了等等。。。。处理起来好浪费时间。。。)

image_thumb16

布局文件:

<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:gravity="center_horizontal"
android:orientation="vertical"
>

<ImageView
android:layout_width="130dp"
android:layout_height="130dp"
android:src="@drawable/ic_launcher"/>

<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名"
android:textSize="18sp" />

<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:hint="请输入姓名" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="学号"
android:textSize="18sp"/>

<EditText
android:id="@+id/number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number"
android:hint="请输入学号" />
</LinearLayout>
<Button
android:onClick="saveInfo"
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击保存"
android:textColor="#ffffff" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/show"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
></LinearLayout>
</ScrollView>
</LinearLayout>

源代码:

package com.example.studentinfo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.text.TextUtils;
import android.util.Log;
import android.util.Xml;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
private EditText name;
private EditText num;
private LinearLayout show;
private Button save;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name=(EditText)findViewById(R.id.name);
num=(EditText)findViewById(R.id.number);
show=(LinearLayout)findViewById(R.id.show);
save=(Button)findViewById(R.id.save);
refleshData();//开启界面后刷新数据
}
/*
* 刷新数据的方法
*/
public void refleshData(){
show.removeAllViews();
File files=getFilesDir();
for (File file : files.listFiles()) {

readXmlData(file);
}

}
/*
* 点击方法
*/
public void saveInfo(View v){
String NAME=name.getText().toString().trim();
String NUM=num.getText().toString().trim();
/*
*
* 1,创建一个序列化器
* 2,初始化序列化器
* 3,写入数据
*/
if (TextUtils.isEmpty(NAME)||TextUtils.isEmpty(NUM)) {
Toast.makeText(this, "输入不能为空,请重新输入", 0).show();
} else {



try {

File file =new File(getFilesDir(),NAME+".xml");
FileOutputStream os=new FileOutputStream(file);//打开一个输入流
XmlSerializer serializer=Xml.newSerializer();//XmlSerializer是个接口,用Xml中newSerializer对象去实现它
serializer.setOutput(os, "utf-8");
serializer.startDocument("utf-8", true);// 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.endTag(null, "student");
serializer.endDocument();
os.close(); //关闭数据流
Toast.makeText(this, "保存成功", 0).show();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(this, "保存失败", 0).show();
}
/*
*
* 保存成功以后刷新数据
*/
refleshData();
}

}

/*
* 读取xml文件方法
*/
public void readXmlData(File file){
XmlPullParser parser=Xml.newPullParser();

try {
FileInputStream inputStream=new FileInputStream(file);
parser.setInput(inputStream, "utf-8");//初始化后便获取指针
/*
*
* 读取xml数据方法:
* 1,获取解析器
* 2,初始化数据,获取指针
* 3,读取数据:
* 第一步:得到事件类型,int类型数据
* 第二步:switch判断数据类型
*/
int type=parser.getEventType();
StringBuilder sb = new StringBuilder();
while (type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
if ("name".equals(parser.getName())) { //这是姓名节点
String name=parser.nextText();
sb.append("姓名:"+name);
} else if("num".equals(parser.getName())) {//这是学号节点
String num=parser.nextText();
sb.append("学号:"+num);
}
break;
}
type=parser.next();//让解析器不停往下解析 我果然是手一抖,就忘记了写上type,导致死循环
Log.i("tag", "死循环了");
Log.i("tag", "又死循环了");
Log.i("tag", "又又死循环了");

}
inputStream.close();
String info=sb.toString();
TextView tv=new TextView(this);
tv.setText(info);
show.addView(tv);
Log.i("tag", ""+num);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
TextView tv = new TextView(this);
tv.setText("这条数据无效");
show.addView(tv);
}


}
}

转载于:https://my.oschina.net/shpxhk/blog/651569

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值