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