package cn.jbit.service;
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.XmlSerializer;
import android.util.Xml;
import cn.jbit.entity.Person;
/**
* 使用 pull 解析 xml 文檔
* @author Administrator
*
*/
public class PullXmlfile {
/**
* 使用 pull 解析 xml 文檔
* @param pulllparser
* @return
* @throws Exception
*/
public List<Person> getXmlPersion(InputStream xml) throws Exception{
List<Person> persons =new ArrayList<Person>();
Person person=null;
// 得到該對象 有兩種方法,其中,第一個是 利用 XmlPullParserFactory 工廠得到, 第二個是利用android提供的API得到
// XmlPullParser pullparser =XmlPullParserFactory.newInstance().newPullParser();
XmlPullParser pullparser =Xml.newPullParser();
pullparser.setInput(xml,"UTF-8"); // 爲創建的pull對象創建 輸入流
int event =pullparser.getEventType(); // 表示獲取一個節點
while(event!=XmlPullParser.END_DOCUMENT){ // 根據 xml 文件的 語法結構 這是獲得 是否是最後一個節點
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if("person".equals(pullparser.getName())){
person=new Person();
person.setId(new Integer(pullparser.getAttributeValue(0)));
}
if("name".equals(pullparser.getName())){
person.setName(pullparser.nextText());
}
if("age".equals(pullparser.getName())){
person.setAge(new Integer(pullparser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if("person".equals(pullparser.getName())){
persons.add(person);
person =null;
}
break;
}
event=pullparser.next(); // 把讀取 節點的指針 指定到 下一個節點
}
return persons;
}
/***
* 保存數據到 xml 文件中
* @param persions
* @param xmlfile 爲 xml 創建 輸出流 ,注意輸出流是要 針對於 本應用程序而已哦
* @throws Exception
* @throws IllegalStateException
* @throws IllegalArgumentException
*/
public static void saveFilexml(List<Person> persions,OutputStream out) throws IllegalArgumentException, IllegalStateException, Exception{
XmlSerializer serializer =Xml.newSerializer(); // 爲xml文件創建了 序列化 對象
serializer.setOutput(out, "UTF-8"); // 爲序列化對 指定 輸出流
serializer.startDocument("UTF-8", true); // true 是否允許單獨存在爲一個文件,注意它的成對出現性
serializer.startTag(null, "persons");
for(Person p: persions){
serializer.startTag(null, "person");
serializer.attribute(null, "id",String.valueOf(p.getId())); // 這是persons 的id屬性值
serializer.startTag(null, "name");
serializer.text(p.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(String.valueOf(p.getAge()));
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
out.flush(); // 這裏這樣做 是爲了 避免是 由 緩存 提交過來的數據
out.close(); // 一定要記得關閉
}
}
以下是:
package cn.jbit.testcase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import cn.jbit.entity.Person;
import cn.jbit.service.PullXmlfile;
import android.test.AndroidTestCase;
import android.util.Log;
public class PersonTestCase extends AndroidTestCase {
public void testPerson () throws Exception{
PullXmlfile pullxml =new PullXmlfile();
InputStream xml =this.getClass().getClassLoader().getResourceAsStream("person.xml");// 獲取輸入流
List<Person> persions =pullxml.getXmlPersion(xml);
for(Person msg:persions){
Log.i("PersonTestCase", msg.getName());
}
}
public void testSave() throws Exception{
List<Person> persions =new ArrayList<Person>();
persions.add(new Person("張三",23,6));
persions.add(new Person("李四",25,7));
persions.add(new Person("王五",13,8));
persions.add(new Person("趙六",43,9));
persions.add(new Person("zhangXX",20,10));
File file =new File(getContext().getFilesDir(),"persons.xml"); // 這裏獲得是當前的包路勁哦
FileOutputStream xmlfile =new FileOutputStream(file,true);
PullXmlfile.saveFilexml(persions, xmlfile);
}
}