Android的pull读写XML

需求:

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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值