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;
}