XML文件的建立与解析

xml文件java

通常咱们都会在网络上传输一些格式化后的数据,这种数据会有必定的结构规格和语义, 当另外一方收到数据消息以后就能够按照相同的android

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

第一,建立方法,步骤以下:app

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

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

3,按照必定的格式写入数据,其格式图片示例以下所示:学习

image_thumb6

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

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

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); } } }

相关文章
相关标签/搜索