Android的pull读写XML

需求:

1.将下面这个xml文件,解析成一个个person对象,并添加到一个List中,进行打印

2.在下面这个xml文件中添加一条记录,这个记录从person对象获取  (先将下面的xml解析称person对象,放入一个集合中,再添加一个person对象到list中,最后展示的结果就和在下面xml中添加一条数据的效果一样)



	
		法师	    
		85	    
	    
	
		萨满	    
		90	    
	    
	
		猎人	     
		50	    
	    




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 loadPersons(InputStream in) throws XmlPullParserException, IOException {
		XmlPullParser parser = Xml.newPullParser();// 获取解析器
		parser.setInput(in, "UTF-8");// 设置输入流,指定码表
		
		ArrayList persons = new ArrayList();
		Person person = null;
		//循环获取当前的事件类型,如果事件类型不是结束文档,那么就指向下一个事件类型   (一个标签是一个事件)
		for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser.next()) {
			if(type==XmlPullParser.START_TAG){//标签开始事件   
				if("person".equals(parser.getName())){//标签
					//创建对象
					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())){//标签
					//获取下一个文本
					String name = parser.nextText();
					//设置name
					person.setName(name);
				}else if("age".equals(parser.getName())){//标签
					//设置age
					String age = parser.nextText();
					//设置age
					person.setAge(Integer.parseInt(age));
				}
			}
		}
		return persons;
	}
	
	//将person对象中的数据添加到xml文件中
	public void savePersons(List 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");//
		
		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();//结束文档
	}
}



测试类:

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



结果为



	
		法师
		85
	
	
		萨满
		90
	
	
		猎人
		50
	
	
		皮卡丘
		3
	



你可能感兴趣的:(Android)