1. 程式人生 > >Android核心技術-day02-09-生成xml檔案 及 解析

Android核心技術-day02-09-生成xml檔案 及 解析

AndroidManifest.xml

方式一:

package com.gaozewen.savexmlinfo;

import android.Manifest;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;

public class MainActivityOld extends BaseActivity {

    private EditText mEt_id;
    private EditText mEt_name;
    private EditText mEt_age;

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

        // 1. 找到所有需要用到的空間
        mEt_id = findViewById(R.id.et_id);
        mEt_name = findViewById(R.id.et_name);
        mEt_age = findViewById(R.id.et_age);
    }

    // 2. 將控制元件內容寫到 xml 檔案當中
    public void save(View view) {
        // 3. 根據控制元件讀取使用者輸入的文字放入到字串變數中
        String id =  mEt_id.getText().toString().trim();
        String name =  mEt_name.getText().toString().trim();
        String age =  mEt_age.getText().toString().trim();
        // 4. 判斷是否有空的內容
        if (TextUtils.isEmpty(id) || TextUtils.isEmpty(name) || TextUtils.isEmpty(age)) {
            Toast.makeText(this,"資訊不能為空", Toast.LENGTH_SHORT).show();
            return;
        } else {
            // 5. 將字串寫入到 xml 檔案中
            final StringBuffer sb = new StringBuffer();
            sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>");
            sb.append("<info>");
            sb.append("<student>");
            sb.append("<id>"+id+"</id>");
            sb.append("<name>"+name+"</name>");
            sb.append("<age>"+age+"</age>");
            sb.append("</student>");
            sb.append("</info>");

            // 請求寫入 sd 卡的許可權
            performCodeWithPermission("儲存學生資訊到SD卡", new PermissionCallback() {
                @Override
                public void hasPermission() {
                    try {
                        File file = new File(Environment.getExternalStorageDirectory(), "info.xml");
                        FileOutputStream fos = new FileOutputStream(file);
                        fos.write(sb.toString().getBytes());
                        fos.close();
                        Toast.makeText(MainActivityOld.this,"儲存學生資訊成功", Toast.LENGTH_SHORT).show();
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(MainActivityOld.this,"儲存學生資訊失敗", Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void noPermission() {
                    Toast.makeText(MainActivityOld.this,"沒有被授予許可權", Toast.LENGTH_SHORT).show();
                }
            }, Manifest.permission.WRITE_EXTERNAL_STORAGE);


        }
    }
}

方式二:

package com.gaozewen.savexmlinfo;

import android.Manifest;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Xml;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import org.xmlpull.v1.XmlSerializer;

import java.io.File;
import java.io.FileOutputStream;

public class MainActivity extends BaseActivity {

    private EditText mEt_id;
    private EditText mEt_name;
    private EditText mEt_age;

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

        // 1. 找到所有需要用到的空間
        mEt_id = findViewById(R.id.et_id);
        mEt_name = findViewById(R.id.et_name);
        mEt_age = findViewById(R.id.et_age);
    }

    // 2. 將控制元件內容寫到 xml 檔案當中
    public void save(View view) {
        // 3. 根據控制元件讀取使用者輸入的文字放入到字串變數中
        final String id = mEt_id.getText().toString().trim();
        final String name = mEt_name.getText().toString().trim();
        final String age = mEt_age.getText().toString().trim();
        // 4. 判斷是否有空的內容
        if (TextUtils.isEmpty(id) || TextUtils.isEmpty(name) || TextUtils.isEmpty(age)) {
            Toast.makeText(this, "資訊不能為空", Toast.LENGTH_SHORT).show();
        } else {
            // 請求寫入 sd 卡的許可權
            performCodeWithPermission("儲存學生資訊到SD卡", new PermissionCallback() {
                @Override
                public void hasPermission() {
                    // 1. 建立一個 xml 檔案的序列化器
                    // 2. 設定檔案的輸出和編碼方式
                    // 3. 寫 xml 檔案的頭
                    // 4. 寫 info 節點
                    // 5. 寫 student 節點
                    // 6. 寫 屬性
                    // 7. 寫 name
                    // 8. 寫 age
                    XmlSerializer serializer = Xml.newSerializer();
                    try {
                        FileOutputStream fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "info.xml"));
                        serializer.setOutput(fos, "utf-8");
                        serializer.startDocument("utf-8",true);
                        serializer.startTag(null,"info");
                        serializer.startTag(null,"student");
                        serializer.attribute(null,"id",id);
                        serializer.startTag(null,"name");
                        serializer.text(name);
                        serializer.endTag(null,"name");
                        serializer.startTag(null,"age");
                        serializer.text(age);
                        serializer.endTag(null,"age");
                        serializer.endTag(null,"student");
                        serializer.endTag(null,"info");
                        serializer.endDocument();
                        fos.close();
                        Toast.makeText(MainActivity.this,"儲存學生資訊成功", Toast.LENGTH_SHORT).show();
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(MainActivity.this,"儲存學生資訊失敗", Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void noPermission() {
                    Toast.makeText(MainActivity.this, "沒有被授予許可權", Toast.LENGTH_SHORT).show();
                }
            }, Manifest.permission.WRITE_EXTERNAL_STORAGE);


        }
    }
}

解析:

package com.gaozewen.pulldemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Xml;
import android.view.View;

import org.xmlpull.v1.XmlPullParser;

import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

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

    public void click(View view) {
        try {
            InputStream is = this.getAssets().open("info.xml");
            // 解析 info.xml
            try {
                // 1. 得到 xml 檔案的解析器
                XmlPullParser parser = Xml.newPullParser();
                // 2. 得到輸入流
                parser.setInput(is, "utf-8");
                // 3. 解析 xml 檔案,獲取當前事件型別
                int type = parser.getEventType();
                while (type != XmlPullParser.END_DOCUMENT) {
                    System.out.println(type + "----" + parser.getName() + "----" + parser.getText());
                    type = parser.next();
                }
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}