安卓项目中,我们常常需要解析xml文件。
我们先将person.xml文件放入asset文件下。
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="18">
<name>allen</name>
<age>36</age>
</person>
<person id="28">
<name>james</name>
<age>25</age>
</person>
</persons>
然后我们需要一个Person的实体类来存储解析到的person对象
public class Person {
private int id;
private String name;
private int age;
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
读取xml文件的方法如下:
public class PersonService {
private Context context;
public PersonService(Context context) {
this.context = context;
}
/**
* 把person.xml的输入流 解析 转化成list集合
* @param filename assets目录下的文件名
* @return
*/
public List<Person> getPersons(String filename){
AssetManager manager = context.getAssets();
try {
InputStream is = manager.open(filename);
//在android下使用pull解析xml文件
//1.获取pull解析器的实例
XmlPullParser parser = Xml.newPullParser();
//2.设置解析器的一些参数
parser.setInput(is, "utf-8");
// 获取pull解析器对应的事件类型
int type = parser.getEventType();
Person person = null;
List<Person> persons = new ArrayList<Person>();
while(type!=XmlPullParser.END_DOCUMENT){
if(type==XmlPullParser.START_TAG){
if("person".equals(parser.getName())){//读到了一个person
person = new Person();
int id =Integer.parseInt( parser.getAttributeValue(0));
person.setId(id);
}else if("name".equals(parser.getName())){
String name = parser.nextText();
person.setName(name);
}else if("age".equals(parser.getName())){
int age = Integer.parseInt( parser.nextText());
person.setAge(age);
}
}
if(type==XmlPullParser.END_TAG){//一个person读完了
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
}
type = parser.next();//继续读下一个person
}
return persons;
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "获取person.xml失败", Toast.LENGTH_SHORT).show();
return null;
}
}
}
那么,下面给出将Person集合写入xml文件的方法:
注意:如果使用Environment.getExternalStorageDirectory()这句代码来获得sd卡的存储路径,除了加上外部存储权限还要加上这个权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
/**
* 把persons集合里面的内容写到xml文件里面
* @param persons person的集合
* @return
*/
public boolean savePersonToXml(List<Person> persons){
try {
XmlSerializer serializer = Xml.newSerializer();
// /sdcard/person.xml
// mount unmount 文件系统的权限
File file = new File(Environment.getExternalStorageDirectory(),"person.xml");
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos, "utf-8");
serializer.startDocument("utf-8", true);
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, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument();
fos.flush();
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}