在Android开发中,解析和读取xml是难免的.如何选择作为xml解析的工具类呢?因为是基于Android移动平台开发,那么内存就显得弥足珍贵了.
DOM、SAX、Pull,推荐使用SAX、Pull作为xml的解析工具类,它们比和Dom相比,解析速度要快,占用系统内存少.
Pull解析XML文件:
public static List<Person> parseXml(InputStream inStream)
throws XmlPullParserException, IOException {
List<Person> persons = null;
Person person = null;
// 使用Android提供的Xml创建pull解析器
XmlPullParser xmlPullParser = Xml.newPullParser();
// 设置流文件
xmlPullParser.setInput(inStream, "UTF-8");
// 产生第一个事件
int eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {// 如果不是文档末尾
String tag = xmlPullParser.getName();//获取节点名
Log.i(TAG, tag+"====>");
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if ("person".equals(tag)) {
person = new Person();
person.setPersonId(Integer.valueOf(xmlPullParser.getAttributeValue(0)));
} else if ("name".equals(tag)) {
//注意:这里获取文本元素是通过nextText()不是getText()
person.setPersonName(xmlPullParser.nextText());
} else if ("age".equals(tag)) {
person.setPersonAge(Integer.valueOf(xmlPullParser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if("person".equals(tag))
persons.add(person);
break;
}
eventType = xmlPullParser.next();// 推进到下一个元素,并触发事件
}
return persons;
}
写入Xml文件到Android系统:
public static void writeXml(List<Person> persons,OutputStream outStream) throws IllegalArgumentException, IllegalStateException, IOException{
XmlSerializer xmlSerializer = Xml.newSerializer();
xmlSerializer.setOutput(outStream, "UTF-8");
xmlSerializer.startDocument("UTF-8", true);//--><?xml ... ?>
xmlSerializer.startTag(null, "persons");
for(Person person:persons){
xmlSerializer.startTag(null, "person");
xmlSerializer.attribute(null, "id", person.getPersonId().toString());
xmlSerializer.startTag(null, "name");
xmlSerializer.text(person.getPersonName());
xmlSerializer.endTag(null, "name");
xmlSerializer.startTag(null, "age");
xmlSerializer.text(person.getPersonAge().toString());
xmlSerializer.endTag(null, "age");
xmlSerializer.endTag(null, "person");
}
xmlSerializer.endTag(null, "persons");
xmlSerializer.endDocument();
outStream.flush();//要刷新缓冲区
outStream.close();
Log.i(TAG, outStream.toString());
}