在项目中会遇到对于XML的增删改查。有一些模块数据需要动态的展示,根据用户偏好,或者用户手动输入的数据显示,我们将这些数据存储在SD卡下,已XML格式保存。
下面是代码:
MainActivity .java
package com.example.xmltest;
import java.util.List;
import android.os.Bundle;
import android.os.Environment;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
@SuppressLint("UseValueOf")
public class MainActivity extends Activity {
//private static final String TAG = "PersonServiceTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XMLService xmlService=new XMLService();
String path=Environment.getExternalStorageDirectory().toString()+"/person.xml";
/**查询数据
try {
List<Person> persons=xmlService.getPersons(path);
for(Person person:persons){
Log.i("Test",person.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
/**增加数据
Person p=new Person(11, "bank", 25);
try {
xmlService.addPerson(p, path);
//查看结果
List<Person> persons=xmlService.getPersons(path);
for(Person person:persons){
Log.i("Test",person.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
/**删除数据
try {
xmlService.deletePerson(32, path);
//查看结果
List<Person> persons=xmlService.getPersons(path);
for(Person person:persons){
Log.i("Test",person.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
//修改数据
Person p=new Person(11, "bank", 100);
try {
xmlService.updatePerson(p, path);
//查看结果
List<Person> persons=xmlService.getPersons(path);
for(Person person:persons){
Log.i("Test",person.toString());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
数据类Person.java
package com.example.xmltest;
public class Person {
private int id;
private String name;
private int age;
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;
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person(){}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
工具类:完成xml的增删改查
package com.example.xmltest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.os.Environment;
import android.util.Xml;
public class XMLService {
/**
* 查询XML文件下的数据
* @param path 文件路径
* @return
* @throws Exception
*/
public List<Person> getPersons(String path) throws Exception{
InputStream xml = new FileInputStream(path);
List<Person> persons =null;
Person person=null;
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml, "UTF-8");
int event = pullParser.getEventType();
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
if("person".equals(pullParser.getName())){
int id = new Integer(pullParser.getAttributeValue(0));
person = new Person();
person.setId(id);
}
if("name".equals(pullParser.getName())){
String name = pullParser.nextText();
person.setName(name);
}
if("age".equals(pullParser.getName())){
int age = new Integer(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;
}
/**
* 增加数据
*
* @param person
* @param path
* @throws Exception
*/
public void addPerson(Person person,String path) throws Exception{
List<Person> persons=null;
//1、先解析xml数据
File file=new File(path);
try {
persons= getPersons(path);
} catch (Exception e) {
e.printStackTrace();
}
//2、添加入新的数据person
persons.add(person);
//3、生成新的XML
file.delete();
NewXML(persons);
}
/**
* 删除数据
* @param id
* @param path
* @throws Exception
*/
public void deletePerson(int id,String path) throws Exception{
List<Person> persons=null;
//1、先解析xml数据
File file=new File(path);
try {
persons= getPersons(path);
} catch (Exception e) {
e.printStackTrace();
}
//2、删除person
Person p=null;
for (Person person:persons) {
if(person.getId()==id){
p=person;
}
}
persons.remove(p);
//3、生成新的XML
file.delete();
NewXML(persons);
}
/**
* 修改数据,传入需要需改的person
* @param p
* @param path
* @throws Exception
*/
public void updatePerson(Person p,String path) throws Exception{
List<Person> persons=null;
//先解析xml数据
File file=new File(path);
try {
persons= getPersons(path);
} catch (Exception e) {
e.printStackTrace();
}
//修改person
Person p1=null;
for (Person person:persons) {
if(person.getId()==p.getId()){
p1=person;
}
}
persons.remove(p1);
persons.add(p);
//生成新的XML
file.delete();
NewXML(persons);
}
/**
*根据传入的persons,在指定路径下,重新生成XML文件
* @param persons
* @param out
* @throws Exception
*/
public void NewXML(List<Person> persons) throws Exception{
File xmlFile = new File(Environment.getExternalStorageDirectory().toString(), "person.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(outStream, "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();
outStream.flush();
outStream.close();
}
}