Xml序列化器(XmlSerializer類)

實現效果

最開始
在這裏插入圖片描述
要保存的內容
在這裏插入圖片描述
點擊保存按鈕,保存成功
在這裏插入圖片描述
在這裏插入圖片描述
點擊讀取(讀取設置在項目的xml)
在這裏插入圖片描述
在這裏插入圖片描述
點擊下一個是指數據一條條讀取
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

上代碼

設置讀取權限:
在這裏插入圖片描述
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="沒有數據"
        android:id="@+id/tv_readXML"></TextView>

    <Button
        android:layout_width="match_parent"
        android:onClick="SaveXmlClick"
        android:layout_height="wrap_content"
        android:text="XML保存序列化"></Button>

    <Button
        android:onClick="ReadXmlClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="讀取序列化"></Button>

    <Button
        android:onClick="NextClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下一個"></Button>

</LinearLayout>

MainActivity,java

package com.example.xmlpullparser;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Environment;
import android.util.Xml;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

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

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    int index = 0;
    List<Student> students = null;
    TextView tv1 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        students = new ArrayList<Student>();
        tv1 = findViewById(R.id.tv_readXML);
        Student studentBeauty = new Student(001,"范冰冰",20);
        Student studentSexy = new Student(002,"林志玲",21);
        Student studentHandsome = new Student(003,"張傑",22);
        Student studentLover = new Student(004,"薛之謙",23);
        students.add(studentBeauty);
        students.add(studentHandsome);
        students.add(studentLover);
        students.add(studentLover);
    }

    //保存操作
    public void SaveXmlClick(View view){
        File file = new File(Environment.getExternalStorageDirectory(),"note.xml");
        FileOutputStream fileOutputStream = null;
        try{
            fileOutputStream = new FileOutputStream(file);
            //表明採用XML序列化存儲
            XmlSerializer xmlSerializer = Xml.newSerializer();
            xmlSerializer.setOutput(fileOutputStream,"utf-8");
            //開始寫
            xmlSerializer.startDocument("utf-8",true);
            xmlSerializer.startTag(null,"Student");
            for (Student student:students){
                xmlSerializer.startTag(null,"student");
                //寫ID
                xmlSerializer.attribute(null,"id",student.getStudentId()+"");
                xmlSerializer.startTag(null,"name");
                xmlSerializer.text(student.getStudenswatName());
                xmlSerializer.endTag(null,"name");
                xmlSerializer.startTag(null,"age");
                xmlSerializer.text(student.getStudentAge()+"");
                xmlSerializer.endTag(null,"age");
                xmlSerializer.endTag(null,"student");
            }
            xmlSerializer.endTag(null,"Student");
            xmlSerializer.endDocument();
            //寫入磁盤
            xmlSerializer.flush();
            fileOutputStream.close();
            Toast.makeText(MainActivity.this,"Succeed",Toast.LENGTH_SHORT).show();
        }catch (Exception e){
            Toast.makeText(MainActivity.this,"Failed",Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }

    //讀操作
    public void ReadXmlClick(View view){
        students = new ArrayList<Student>();
        students = getStudents(getResources().openRawResource(R.raw.myperson));
        String strList = "";
        for(Student student:students){
            strList+="編號:"+student.getStudentId()+"姓名:"+student.getStudenswatName()+",年齡:"+student.getStudentAge()+"\n";
        }
        tv1.setText(strList);
    }

    //讀出的算法
    private List<Student> getStudents(InputStream inputStream){
        //等待接收讀出來的成員列表
        List<Student> studentRead = null;
        //將讀出來的對象放到一個臨時的變量中進行存儲
        Student student = null;
        //聲明一個解析器
        XmlPullParser xmlPullParser = null;
        try{
            xmlPullParser = Xml.newPullParser();
            //設置解析器xml的來源,並用utf-8進行讀取
            xmlPullParser.setInput(inputStream,"utf-8");
            //獲取事件類型(即xml的標籤類型)
            int eventType = xmlPullParser.getEventType();
            while(eventType!=XmlPullParser.END_DOCUMENT){
                switch (eventType){
                    case XmlPullParser.START_DOCUMENT:
                        studentRead = new ArrayList<Student>();
                        break;
                    case XmlPullParser.START_TAG:
                        if(xmlPullParser.getName().equals("student")){
                            String strId = xmlPullParser.getAttributeValue(0);
                            student = new Student();
                            student.setStudentId(Integer.parseInt(strId));
                            eventType = xmlPullParser.next();
                        }else if(xmlPullParser.getName().equals("name")){
                            String stuname = xmlPullParser.nextText();
                            student.setStudentName(stuname);
                            eventType = xmlPullParser.next();
                        }else if(xmlPullParser.getName().equals("age")){
                            String strage = xmlPullParser.nextText();
                            student.setStudentAge(Integer.parseInt(strage));
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if(xmlPullParser.getName().equals("student")){
                            studentRead.add(student);
                            student = null;
                    }
                        break;
                }
                eventType = xmlPullParser.next();
            }
            inputStream.close();
        }catch (Exception e){
            e.printStackTrace();
            Toast.makeText(MainActivity.this,"Failed",Toast.LENGTH_SHORT).show();
        }
        return studentRead;
    }

    public void NextClick(View view){
        List<Student> students1 = getStudents(getResources().openRawResource(R.raw.myperson));
        Student student = students1.get(index);
        String strList = "";
        //一個一個顯示
        strList="編號:"+student.getStudentId()+"姓名:"+student.getStudenswatName()+",年齡:"+student.getStudentAge()+"\n";
        tv1.setText(strList);
        index++;
        if(index == students1.size()){
            index = 0;
        }
    }
}

Student.java

package com.example.xmlpullparser;

public class Student {
    int StudentId = 0;
    String StudentName = "";
    int StudentAge = 0;

    public Student(int studentId, String studentName, int studentAge) {
        StudentId = studentId;
        StudentName = studentName;
        StudentAge = studentAge;
    }

    public Student(){

    }

    public int getStudentId() {
        return StudentId;
    }

    public void setStudentId(int studentId) {
        StudentId = studentId;
    }

    public String getStudenswatName() {
        return StudentName;
    }

    public void setStudentName(String studentName) {
        StudentName = studentName;
    }

    public int getStudentAge() {
        return StudentAge;
    }

    public void setStudentAge(int studentAge) {
        StudentAge = studentAge;
    }
}

Raw裏面設置的本地待讀取xml:myperson.xml

<?xml version="1.0" encoding="utf-8"?>
<Student>
    <student id="0">
        <name>曹操</name>
        <age>21</age>
    </student>
    <student id="1">
        <name>劉備</name>
        <age>20</age>
    </student>
    <student id="3">
        <name>孫權</name>
        <age>19</age>
    </student>
</Student>

注意事項

要讀取的xml文件必須設置在res下,建立文件夾是value = raw,創建xml文件時必須通過創建file—>file name:.xml 否則會報錯。*
在這裏插入圖片描述

特別注意

僅供參考學習,轉載請附上原文鏈接
圖片來源於網絡、個人收藏、個人製作
該篇文章不做任何商業用途,純屬分享學習心得,如有侵權,望聯繫本人處理
還在讀大學的程序員,項目經驗少,如有紕漏,感謝指正
需要源代碼請私聊聯繫本人
謝謝配合

如果這篇文章對您有幫助,小小的點個贊,算是給小學弟的鼓勵吧!謝謝大佬!!/呱呱.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章