Android的pull讀寫XML

我叫阿狸貓發表於2014-01-20

需求:

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>



相關文章