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