xml文件java
通常咱們都會在網絡上傳輸一些格式化後的數據,這種數據會有必定的結構規格和語義, 當另外一方收到數據消息以後就能夠按照相同的android
結構規格進行解析,從而取出他想要的那部份內容,在網絡上傳輸數據時最經常使用的格式有兩種,XML 和 JSON。目前先大概總結下xml文件的建立與解析。網絡
第一,建立方法,步驟以下:app
1,獲取序列化器 XmlSerializer serializer = Xml.newSerializer();ide
2,初始化序列化器 serializer.setOutput(os, "utf-8");佈局
3,按照必定的格式寫入數據,其格式圖片示例以下所示:學習
serializer.startDocument("utf-8", true); 寫文檔頭 包括編碼ui
serializer.startTag(命名空間,數據);寫開始標籤 this
serializer.text(); 寫文本數據 編碼
serializer.endTag(null, "num"); 寫結束標籤
serializer.endDocument();寫文檔末尾
實際操做以下:
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();//讓解析器解析下一個元素
}
用xml存儲和解析的小案例,學生管理系統
(心得,寫代碼必定要細心,絕對不能粗心,不說能大概就能夠了,否則會埋下好多隱患。。bug。。。,好比大小寫,代碼提示選錯了等等。。。。處理起來好浪費時間。。。)
佈局文件:
<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); } } }