在Android中解析XML的方式有很多,我之前写过一篇Android中解析XML的文章(http://blog.csdn.net/afandaafandaafanda/article/details/41594835)及在JAVA中如何使用JDOM解析XML(http://blog.csdn.net/afandaafandaafanda/article/details/46699215),对于Android来说,需要找到一种对内存要求比较低的方式来解析XML。SAX及PULL是很好的选择,今天写了一个PULL解析XML的例子。
1.Model类:Person
package com.example.model;
public class Person {
private Integer id;
private String name;
private Short age;
public Person(){}
public Person(Integer id, String name, Short age) {
this.id = id;
this.name = name;
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;
}
public Short getAge() {
return age;
}
public void setAge(Short age) {
this.age = age;
}
@Override
public String toString() {
return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
}
}
2.PULLPersonService
package com.wicresoft.service;
import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
import com.example.model.Person;
/**
* 采用Pull解析XML内容
*/
public class PULLPersonService {
public static void save(List<Person> persons, Writer writer) throws Throwable{
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(writer);
serializer.startDocument("UTF-8", true);
serializer.startTag(null, "persons");
for(Person person : persons){
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
writer.flush();
writer.close();
}
public static List<Person> getPersons(InputStream inStream) throws Throwable{
List<Person> persons = null;
Person person = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();//产生第一个事件
while(eventType != XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
String name = parser.getName();//获取解析器当前指向的元素的名称
if("person".equals(name)){
person = new Person();
person.setId(Integer.valueOf(parser.getAttributeValue(0)));
}
if(person!=null){
if("name".equals(name)){
person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
}
if("age".equals(name)){
person.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
break;
}
eventType = parser.next();
}
return persons;
}
}
3.单元测试:PersonServiceTest
package com.example.myandroid_001;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import com.example.model.Person;
import com.wicresoft.service.PULLPersonService;
import android.test.AndroidTestCase;
import android.util.Log;
public class PersonServiceTest extends AndroidTestCase {
private static final String TAG = "PersonServiceTest";
public void testSave() throws Throwable{
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(34, "lili", (short)12));
persons.add(new Person(56, "zhang", (short)32));
persons.add(new Person(39, "wang", (short)40));
StringWriter writer = new StringWriter();
PULLPersonService.save(persons, writer);
Log.i(TAG, writer.toString());
}
public void testPullGetPersons() throws Throwable{
InputStream inStream = getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = PULLPersonService.getPersons(inStream);
for(Person person : persons){
Log.i(TAG, person.toString());
}
}
}
3.person.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>liming</name>
<age>30</age>
</person>
<person id="20">
<name>lixiangmei</name>
<age>25</age>
</person>
</persons>
总结:
PULL解析XML最大的特点在于使用了事件驱动机制,即遇到文档的开始或者结尾,都会触发相应的事件,用户根据触发的事件,做相应的相应。