需求:
1.将下面这个xml文件,解析成一个个person对象,并添加到一个List中,进行打印
2.在下面这个xml文件中添加一条记录,这个记录从person对象获取 (先将下面的xml解析称person对象,放入一个集合中,再添加一个person对象到list中,最后展示的结果就和在下面xml中添加一条数据的效果一样)
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>法师</name>
<age>85</age>
</person>
<person id="2">
<name>萨满</name>
<age>90</age>
</person>
<person id="3">
<name>猎人</name>
<age>50</age>
</person>
</persons>
domain
public class Person {
private Integer id;
private String name;
private Integer 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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
}
}
PersonService
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import android.util.Xml;
/**
* 将xml中的内容设置到Person对象
* 1.获取一个输入流,读取xml文件
* 2.常见pull解析器,并设置输入流
* 3.循环获取事件类型,一次判断当标签为person,name,age时所对应的状态
* parser.getAttributeValue(0)是获取标签上的属性
* parser.nextText();获取下一个文本
*/
public class PersonService {
//将xml文件内容设置到person对象中
public List<Person> loadPersons(InputStream in) throws XmlPullParserException, IOException {
XmlPullParser parser = Xml.newPullParser();// 获取解析器
parser.setInput(in, "UTF-8");// 设置输入流,指定码表
ArrayList<Person> persons = new ArrayList<Person>();
Person person = null;
//循环获取当前的事件类型,如果事件类型不是结束文档,那么就指向下一个事件类型 (一个标签是一个事件)
for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next()) {
if(type==XmlPullParser.START_TAG){//标签开始事件 <?xml version="1.0" encoding="UTF-8"?>
if("person".equals(parser.getName())){//<person>标签
//创建对象
person = new Person();
String id = parser.getAttributeValue(0);//获取第一个属性的属性值
//parser.getAttributeValue(null, "id"); 第一个参数是命名空间 第二个参数是属性名
person.setId(Integer.parseInt(id));//将xml读取出来的属性设置到pserson对象上
persons.add(person);
}else if("name".equals(parser.getName())){//<name>标签
//获取下一个文本
String name = parser.nextText();
//设置name
person.setName(name);
}else if("age".equals(parser.getName())){//<age>标签
//设置age
String age = parser.nextText();
//设置age
person.setAge(Integer.parseInt(age));
}
}
}
return persons;
}
//将person对象中的数据添加到xml文件中
public void savePersons(List<Person> persons,OutputStream out) throws IllegalArgumentException, IllegalStateException, IOException {
XmlSerializer serializer = Xml.newSerializer();//获取序列化对象
serializer.setOutput(out, "UTF-8");
serializer.startDocument("UTF-8", true);//开始文档
serializer.startTag(null, "persons");//<persons>
for (Person person : persons) {
serializer.startTag(null, "person");//<person>
serializer.attribute(null, "id", person.getId().toString());//设置属性
serializer.startTag(null, "name");//<name>
serializer.text(person.getName());//设置标签中间文本内容
serializer.endTag(null, "name");//</name>
serializer.startTag(null, "age");//<age>
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");//</age>
serializer.endTag(null, "person");//</person>
}
serializer.endTag(null, "persons");//</persons>
serializer.endDocument();//结束文档
}
}
import org.xmlpull.v1.XmlPullParserException;
import android.test.AndroidTestCase;
public class PersonTest extends AndroidTestCase {
public void testLoad() throws XmlPullParserException, IOException{
PersonService service = new PersonService();
//获取src下person.xml的输入流
InputStream in = PersonTest.class.getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = service.loadPersons(in);
for (Person person : persons) {
System.out.println(person);
}
Person person = new Person(4,"皮卡丘",3);
persons.add(person);
service.savePersons(persons,new FileOutputStream("/mnt/sdcard/persons.xml"));
}
}
结果为
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<persons>
<person id="1">
<name>法师</name>
<age>85</age>
</person>
<person id="2">
<name>萨满</name>
<age>90</age>
</person>
<person id="3">
<name>猎人</name>
<age>50</age>
</person>
<person id="4">
<name>皮卡丘</name>
<age>3</age>
</person>
</persons>