1. 程式人生 > >Android 讀取xml,XmlPullParser用法

Android 讀取xml,XmlPullParser用法

  • 讀取main/assets資原始檔夾裡的xml檔案

1.建立了一個activity按鈕,以下是按鈕實現讀取xml檔案,並儲存到list輸出到控制檯

    public void btn(View view){

        try {
            //從資原始檔夾assets下的xml 建立輸入流,將檔案輸入
            InputStream as = this.getAssets().open("info.xml");
            //例項化一個xml解析器
            XmlPullParser xmlPullParser = Xml.newPullParser();
            //將輸入流輸入給xml解析器
            xmlPullParser.setInput(as,"utf-8");

            //獲取xml解析器的xml節點編號
            int eventType =  xmlPullParser.getEventType();

            //讀取全部xml內容
            while(eventType != XmlPullParser.END_DOCUMENT){

                switch (eventType) {
                    //開始讀檔案
                    case XmlPullParser.START_DOCUMENT:
                        persons = new ArrayList<Person>();
                        break;
                    //xml找到的節點儲存到list
                    case XmlPullParser.START_TAG:
                        if (xmlPullParser.getName().equals("person")) {
                            person = new Person();
                            //獲取person屬性id
                            String id = xmlPullParser.getAttributeValue(0);
                            //日誌
                            Log.d("person.id", id);
                            person.setId(Integer.parseInt(id));
                            eventType = xmlPullParser.next();
                        } else if (xmlPullParser.getName().equals("name")) {
                            String name = xmlPullParser.nextText();
                            Log.d("person.name", name);
                            person.setName(name);
                            eventType = xmlPullParser.next();
                        } else if (xmlPullParser.getName().equals("age")) {
                            String age = xmlPullParser.nextText();
                            Log.d("person.age", age);
                            person.setAge(Integer.valueOf(age));
                            eventType = xmlPullParser.next();
                        }
                        break;
                    //結束節點
                    case XmlPullParser.END_TAG:
                        if (xmlPullParser.getName().equals("person")) {
                            persons.add(person);
                            person = null;
                        }
                        break;
                }
                //下一個xml節點
                eventType = xmlPullParser.next();
            }
            //關閉輸入流
            as.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //迴圈輸出內容
        for (int i = 0; i < persons.size(); i++) {
            System.out.println("name:"+persons.get(i).getName()+" age:"+persons.get(i).getAge()+" id:"+persons.get(i).getId());
        }
    }
  • person類,可以clt+insert快速建立
public class Person {
    private String name;
    private Integer age;
    private Integer id;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        if (age < 1 || age > 100) {
            this.age = 0;
        } else {
            this.age = age;
        }
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {

        return name;

    }

    public void setName(String name) {
        this.name = name;
    }
}

  • xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person id="1101">
        <name>amos</name>
        <age>30</age>
    </person>
    <person id="1102">
        <name>tom</name>
        <age>18</age>
    </person>
</persons>
  • 寫xml提示(自看)
    public void save(View view) {
        // 3.根據控制元件讀取使用者輸入的文字放入到字串變數中
        final String name = et_name.getText().toString().trim();
        final String age = et_age.getText().toString().trim();
        final String id = et_id.getText().toString().trim();

        // 4.判斷是否有空的內容
        if (TextUtils.isEmpty(name) || TextUtils.isEmpty(age) || TextUtils.isEmpty(id)) {
            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 id=" + id + ">");
            sb.append("<name>" + name + "</name>");
            sb.append("<age>" + age + "</age>");
            sb.append("</student>");
            sb.append("</info>");

            performCodeWithPermission("儲存學生資訊到sd卡", new PermissionCallback() {
                @Override
                public void hasPermission() {
                    // 1.建立一個xml檔案的序列化器
                    XmlSerializer serializer = Xml.newSerializer();
                    //檔案輸出流
                    FileOutputStream fos = null;
                    try {
                        fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory(), "info.xml"));

                        // 2.設定檔案的輸出和編碼方式
                        serializer.setOutput(fos, "utf-8");

                        // 3.寫xml檔案的頭
                        serializer.startDocument("utf-8", true);

                        // 4.寫info節點
                        serializer.startTag(null, "info");

                        // 5.寫student節點
                        serializer.startTag(null, "student");

                        // 6.寫屬性
                        serializer.attribute(null, "id", id);

                        // 7. 寫name
                        serializer.startTag(null, "name");
                        serializer.text(name);
                        serializer.endTag(null, "name");

                        // 8. 寫age
                        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();
                    }
                }

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