天天看點

Android 讀寫xml檔案

Android裡面操作xml檔案主要有三種方式:

SAX方式,DOM方式,PULL方式。據說因為DOM的方式比較耗記憶體,而手機最糾結的就是存儲空間小的問題,是以在Android裡面不提倡使用DOM的方式。而SAX方式和PULL方式的思想比較的相似,原理似乎是同出一則的,實作的思想好像是讀取字元串的每一個單詞一樣,每讀取一段就判斷讀取的是什麼内容然後執行相應的方法,直至檔案的結尾。

本文的例子主要采用PULL方式讀寫xml,廢話不多說,直接上代碼。

xml檔案如下

<persons>
  <person>
    <name>北京</name>
    <number>123324324</number>
  </person>
  <person>
    <name>東坡</name>
    <number>1-591-992-5643</number>
  </person>
  <person>
    <name>俊偉</name>
    <number>1-379-784-7916</number>
  </person>
</persons>
           

讀xml的代碼:

public static boolean readFixedNumbersFromXml() {
        XmlPullParser xmlParser = Xml.newPullParser();
        File file = new File(LISTENED_NUMBERS_FILE);
        if (!file.exists()) {
            Log.d(TAG, "file :" + LISTENED_NUMBERS_FILE + " is not exist, create it!");
            return false;
        }

        int eventType = 0;
        try {
            FileInputStream fis = new FileInputStream(file);
            xmlParser.setInput(fis, "UTF-8");
            eventType = xmlParser.getEventType();

            ListenInfoManager.ListenedPerson person = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                Log.d(TAG, "eventType=" + eventType);
                switch (eventType) {
                    case XmlPullParser.START_DOCUMENT:
                        break;
                    case XmlPullParser.START_TAG:
                        Log.d(TAG, "name=" + xmlParser.getName());
                        if ("person".equals(xmlParser.getName())) {
                            person = new ListenInfoManager.ListenedPerson();
                        }

                        if ("name".equals(xmlParser.getName())) {
                            if (person != null) {
                                person.setName(xmlParser.nextText());
                            }
                        }

                        if ("number".equals(xmlParser.getName())) {
                            if (person != null) {
                                person.setNumber(xmlParser.nextText());
                            }
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if ("person".equals(xmlParser.getName())) {
                            Log.d(TAG, "name:" + xmlParser.getName() + ", person=" + person);
                            ListenInfoManager.self().addToCustomNumberList(person);
                            person = null;
                        }
                        break;
                    default:
                        break;
                }
                eventType = xmlParser.next();
            }
        } catch (FileNotFoundException e) {
            Log.d(TAG, "file not found exception!");
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            Log.d(TAG, "XmlPullParserException!");
            e.printStackTrace();
        } catch (IOException e) {
            Log.d(TAG, "IOException!");
            e.printStackTrace();
        }

        return true;
    }
           

寫xml代碼如下:

public static boolean writeFixedNumbersToXmlFile() {
        FileOutputStream fos = null;
        File file = new File(LISTENED_NUMBERS_FILE_PATH);
        if (!file.exists()) {
            file.mkdirs();
        }

        try {
            file = new File(LISTENED_NUMBERS_FILE);
            if (!file.createNewFile()) {
                Log.d(TAG, "file already exist!");
                file.delete();
                if (!file.createNewFile()) {
                    Log.d(TAG, "Create file failed!");
                    return false;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            Log.d(TAG, "create xml file failed!");
        }
        try {
            fos = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            return false;
        }
        XmlSerializer serializer = Xml.newSerializer();
        try {
            serializer.setOutput(fos, "UTF-8");

            //縮進
            serializer.setFeature(
                    "http://xmlpull.org/v1/doc/features.html#indent-output",
                    true);
            serializer.startDocument("UTF-8", true);
            serializer.startTag(null, "persons");
            for (ListenedPerson person : ListenInfoManager.self().getCustomNumberList()) {
                serializer.startTag(null, "person");

                serializer.startTag(null, "name");
                serializer.text(person.getName());
                serializer.endTag(null, "name");

                serializer.startTag(null, "number");
                serializer.text(person.getNumber());
                serializer.endTag(null, "number");

                serializer.endTag(null, "person");
            }
            serializer.endTag(null, "persons");
            serializer.endDocument();

            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            Log.d(TAG, "IOException write xml file failed!");
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            Log.d(TAG, "Exception write xml file failed!");
            return false;
        }
        return true;
    }