本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1
一.创建一个XML项目,步骤如下:
二.解析一个xml文件:
assets/person.xml
amos
30
tom
18
com/amos/xml/domain/Person.java
packagecom.amos.xml.domain;/*** Created by amosli on 14-6-3.*/
public classPerson {privateString name;privateInteger age;privateInteger id;publicInteger getAge() {returnage;
}public voidsetAge(Integer age) {if (age < 1 || age > 100) {this.age = 0;
}else{this.age =age;
}
}publicInteger getId() {returnid;
}public voidsetId(Integer id) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}
}
com/amos/xml/service/PersonService.java
packagecom.amos.xml.service;importandroid.content.Context;importandroid.content.res.AssetManager;importandroid.util.Log;importandroid.util.Xml;importcom.amos.xml.domain.Person;importorg.xmlpull.v1.XmlPullParser;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;/*** Created by amosli on 14-6-3.*/
public classPersonService {privateContext context;publicPersonService(Context context) {this.context =context;
}/*** 把person.xml的输入流解析转化成list集合
*
*@param*@return
*/
public ListgetPersons(String filename) {
AssetManager manager=context.getAssets();//初始化项目.
List persons = null;
Person person= null;try{
InputStream inputStream=manager.open(filename);//在android下使用xmlpullparser进行解析
XmlPullParser xmlPullParser =Xml.newPullParser();//设置xmlpullparser的一些参数
xmlPullParser.setInput(inputStream, "utf-8");//获取pull解析器对应事件类型
int eventType =xmlPullParser.getEventType();while (eventType !=XmlPullParser.END_DOCUMENT) {switch(eventType) {caseXmlPullParser.START_DOCUMENT:
persons= new ArrayList();break;caseXmlPullParser.START_TAG:if (xmlPullParser.getName().equals("person")) {
person= newPerson();
String id= xmlPullParser.getAttributeValue(0);
Log.d("person.id", id);
person.setId(Integer.parseInt(id));
eventType=xmlPullParser.next();
}else if (xmlPullParser.getName().equals("name")) {
String name=xmlPullParser.nextText();
Log.d("person.name", name);
person.setName(name);
eventType=xmlPullParser.next();
}else if (xmlPullParser.getName().equals("age")) {
String age=xmlPullParser.nextText();
Log.d("person.age", age);
person.setAge(Integer.valueOf(age));
eventType=xmlPullParser.next();
}break;caseXmlPullParser.END_TAG:if (xmlPullParser.getName().equals("person")) {
persons.add(person);
person= null;
}break;
}
eventType=xmlPullParser.next();
}
}catch(Exception e) {
e.printStackTrace();
}returnpersons;
}
}
注:这里解析主要用到的是eventType(事件类型),如果是START_DOCUMENT则表示读到文档开始位置,如果是START_TAG,则表示读到文档中的元素开始位置,如,类似的结束位置为END_DOCUMENT和END_TAG;其中要注意判断其事件类型开始的名称是什么,并且取值时,注意其不同位置取值方式也不一样,如,那么取id的方式为getAttributeValue(int index),另外取amos,则要用nextText()方法进行取值.
/com/amos/xml/MyActivity.java
packagecom.amos.xml;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.TextView;importandroid.widget.Toast;importcom.amos.xml.domain.Person;importcom.amos.xml.service.PersonService;importjava.util.List;public class MyActivity extendsActivity {/*** Called when the activity is first created.*/@Overridepublic voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView show_users=(TextView) findViewById(R.id.show_users);
PersonService personService= new PersonService(this);
StringBuilder stringBuilder= newStringBuilder();
List persons = personService.getPersons("person.xml");for(Person person : persons) {
stringBuilder.append(" " + person.getName()).append(":").append(person.getAge());
}
System.out.println("stringBuilder:" +stringBuilder);
show_users.setText(stringBuilder);
Toast.makeText(this, "数据写入成功!" +stringBuilder, Toast.LENGTH_LONG);
}
}
这里我在主界面定义了一个TextView,用来显示读取到的xml文件的内容,效果如下图所示:
3.测试用例
首先,加入必要的配置:AndroidManifest.xml
其中加粗的部分是后加入到项目中的.
其次,写一个testcase:/com/amos/xml/test/TestService.java
package com.amos.xml.test;
import android.test.AndroidTestCase;
import com.amos.xml.domain.Person;
import com.amos.xml.service.PersonService;
import java.util.List;
/**
* Created by amosli on 14-6-3.
*/
public class TestService extends AndroidTestCase {
public void testGetPersons() throws Exception {
PersonService personService = new PersonService(getContext());
Listpersons = personService.getPersons("person.xml");
for (Person person : persons) {
System.out.println(person.getName());
}
}
}
这里想要查看每一步的运行步骤,可以加上断点,intelij 中的快捷键是F8(step over),F7(step into),F9(Resume program).