说明:该文章所写的案例和博文 《Android中Pull解析器解析xml文件案例》使用同一个工程测试;
首先
给出一个想要输出xml文件示例:
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="23">
<name>liming</name>
<age>23</age>
</person>
</persons>
然后
编写业务类:
package com.yangzi.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 com.yangzi.domain.Person;
public class PersonService {
/*
* 解析xml文件
* @param xml xml文件数据流
* @return xml文件里的内容集合
* @throws Exception
* */
public static List<Person> getPersons(InputStream xml) throws Exception {
List<Person> persons = null;
Person person = null;
//得到xmlpull解析器
XmlPullParser pullParser = Xml.newPullParser();
//設置解析器要解析的内容,和编码方式
pullParser.setInput(xml,"utf-8");
//循环读取xml文件的节点
int event = pullParser.getEventType();//得到xml文件中的一个节点
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
//xml文件开始节点,开始节点一般做数据的初始化
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
//若为开始节点
case XmlPullParser.START_TAG:
//若为person节点
if("person".equals(pullParser.getName())){
//得到id
person = new Person();
//int id = Integer.parseInt(pullParser.getAttributeValue(0));
//int id = new Integer(pullParser.getAttributeValue(0));
int id = Integer.valueOf(pullParser.getAttributeValue(0));
person.setId(id);
}
//若为名字节点
if("name".equals(pullParser.getName())){
String name = pullParser.nextText();
person.setName(name);
}
//若为年龄节点
if("age".equals(pullParser.getName())){
//int age = Integer.parseInt(pullParser.nextText());
//int age = new Integer(pullParser.nextText());
int age = Integer.valueOf(pullParser.nextText());
person.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if("person".equals(pullParser.getName())){
persons.add(person);
person = null;
}
break;
}
event = pullParser.next();//读取下一个节点
}
return persons;
}
/*
* 保存至xml文件
* @param out 输出方向
* @param persons 数据
* @throws Exception
* */
public void save(OutputStream out,List<Person> persons) throws Exception{
XmlSerializer serializer = Xml.newSerializer();//获得反序列化对象
serializer.setOutput(out, "utf-8");//设置输出流及编码方式
serializer.startDocument("utf-8", true);//设置xml文件startDocument,同样,后面有对应的endDocument
serializer.startTag(null, "persons");//开始节点
for(Person person:persons){
serializer.startTag(null, "person");//开始节点
serializer.attribute(null, "id",person.getId()+"");//设置开始节点属性值
//一个新的节点
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
//一个新的节点
serializer.startTag(null, "age");
serializer.text(person.getAge()+"");
serializer.endTag(null, "age");
serializer.endTag(null, "persons");//结束节点
}
serializer.endTag(null, "persons");//结束节点
serializer.endDocument();//对应startDocument
out.flush();//刷新流
out.close();//关闭流
}
}
接着
测试一下,测试类的编写:
package com.yangzi.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import android.test.AndroidTestCase;
import android.util.Log;
import com.yangzi.domain.Person;
import com.yangzi.service.PersonService;
public class PersonServiceTest extends AndroidTestCase {
private static final String TAG = "PersonServiceTest";
public static List<Person> persons = null;
public void testPersons() throws Exception{
InputStream in = this.getClass().getClassLoader().getResourceAsStream("person.xml");
persons = PersonService.getPersons(in);
for(Person per:persons){
Log.i(TAG, per.toString());
}
}
/**/
public void testSave()throws Exception{
//调用测试testPersons方法得到persons
testPersons();
//得到该APP的包
String path = getContext().getFilesDir().toString();
//new 新文件
File xmlFile = new File(path,"xxx.xml");
//文件操作流
FileOutputStream out = new FileOutputStream(xmlFile);
PersonService.save(out, persons);
}
}
OK,到此结束啦!