Android开发学习---使用XmlPullParser解析xml文件
Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593
本文将主要介绍pull解析器解析xml文件,环境为ubuntu 12.04+ intelij 13.1 + android sdk 2.1
一.创建一个XML项目,步骤如下:



二.解析一个xml文件:
assets/person.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1101">
<name>amos</name>
<age>30</age>
</person>
<person id="1102">
<name>tom</name>
<age>18</age>
</person>
</persons>
com/amos/xml/domain/Person.java
package com.amos.xml.domain; /**
* Created by amosli on 14-6-3.
*/ public class Person {
private String name;
private Integer age;
private Integer id; public Integer getAge() {
return age;
} public void setAge(Integer age) {
if (age < 1 || age > 100) {
this.age = 0;
} else {
this.age = age;
}
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() { return name; } public void setName(String name) {
this.name = name;
}
}
com/amos/xml/service/PersonService.java
package com.amos.xml.service; import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import android.util.Xml;
import com.amos.xml.domain.Person;
import org.xmlpull.v1.XmlPullParser; import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; /**
* Created by amosli on 14-6-3.
*/
public class PersonService {
private Context context; public PersonService(Context context) {
this.context = context;
} /**
* 把person.xml的输入流解析转化成list集合
*
* @param
* @return
*/
public List<Person> getPersons(String filename) { AssetManager manager = context.getAssets();
//初始化项目.
List<Person> 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) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break; case XmlPullParser.START_TAG:
if (xmlPullParser.getName().equals("person")) {
person = new Person();
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;
case XmlPullParser.END_TAG:
if (xmlPullParser.getName().equals("person")) {
persons.add(person);
person = null;
}
break;
}
eventType = xmlPullParser.next();
} } catch (Exception e) {
e.printStackTrace();
}
return persons;
}
}
注:这里解析主要用到的是eventType(事件类型),如果是START_DOCUMENT则表示读到文档开始位置,如果是START_TAG,则表示读到文档中的元素开始位置,如<name>,类似的结束位置为END_DOCUMENT和END_TAG;其中要注意判断其事件类型开始的名称是什么,并且取值时,注意其不同位置取值方式也不一样,如<person id="1122">,那么取id的方式为getAttributeValue(int index),另外取<name >amos</name>,则要用nextText()方法进行取值.
/com/amos/xml/MyActivity.java
package com.amos.xml; import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import com.amos.xml.domain.Person;
import com.amos.xml.service.PersonService; import java.util.List; public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(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 = new StringBuilder();
List<Person> 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
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amos.xml"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7"/>
<application android:label="@string/app_name">
<uses-library android:name="android.test.runner"/>
<activity android:name="MyActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.amos.xml"/>
</manifest>
其中加粗的部分是后加入到项目中的.
其次,写一个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());
List<Person> persons = personService.getPersons("person.xml");
for (Person person : persons) {
System.out.println(person.getName());
}
}
}
这里想要查看每一步的运行步骤,可以加上断点,intelij 中的快捷键是F8(step over),F7(step into),F9(Resume program).
本文git 地址:https://github.com/amosli/android_basic/tree/xml
Android开发学习---使用XmlPullParser解析xml文件的更多相关文章
- 安卓开发之利用XmlPullParser解析XML文件
package com.lidaochen.phonecall; import android.support.v7.app.AppCompatActivity; import android.os. ...
- 【Android】使用Pull生成/解析XML文件
一.生成XML文件,即是将对象集合转为XML文件存储. 对象集合 –> XML(序列化) Android中使用android.util.Xml类对其进行了描述,提供相应的API. 步骤大致如下: ...
- Android开发学习之反编译APK文件
反编译的目的在于学习一些优秀的Android应用程序代码. 在进行反编译之前,需要准备好下面的软件工具(这些文件都放在同一文件下): 这些工具的下载地址:http://down.51cto.com/d ...
- Android中的几种解析XML文件的类
Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...
- ios开发学习--歌词处理--解析lrc文件
我觉得要想解析lrc 首先大家应该了解一下lrc文件的结构,大家可以去看一下**百科 我这里粗略的写一下: ■ 时间标签(Time-tag) 形式为"[mm:ss]"(分钟数:秒数 ...
- Excel开发学习笔记:读取xml文件及csv文件
遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. ).Split( ...
- Android pull解析xml文件
本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...
- 在iOS 开发中用GDataXML(DOM方式)解析xml文件
因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...
- 【Android学习笔记】XmlResourceParser解析xml文件
最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...
随机推荐
- 配置SSH框架的心得
开发工具为myeclipse,开发工具自带struts2,hibernate,spring框架的导入.在新建的项目上右击Myeclipse->Project Facets->Install ...
- wc命令
wc命令的功能为统计指定文件中的字节数.字数.行数, 并将统计结果显示输出. 语法:wc [选项] 文件- 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同 ...
- IT在线学习网站总结
以下是我自己做软件过程中发现的一些不错的IT学习网站,个人感觉比较受用,故总结出来以供IT爱好者一起学习: www.maiziedu.com 麦子学院 www.jikexueyuan.com 极客学 ...
- Ansible playbook API 开发 调用测试
Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible ...
- Gson运用
输出对象或者对象的list时,我们一般都是重写toString,和遍历list,但是使用Gson输出对象或者对象的list会非常方便. Gson输出list或者对象.Gson数据没有格式化. impo ...
- TJI读书笔记14-闭包与回调
TJI读书笔记14-闭包与回调 闭包与回调 为什么要使用内部类?内部类继承自某个类或者实现某个接口,内部类的代码可以操作外嵌类的对象. 这不是使用内部类的理由. 那么为什么使用内部类呢? 我觉得如 ...
- TCP协议疑难杂症全景解析
说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人. ...
- sip常用消息实体参考(系网上摘抄,感谢分享)
1.MESSAGE消息 1)头字段填写说明 Call-id: 必选 CSeq: 必选 ...
- SQL Server 数据类型映射
SQL Server 和 .NET Framework 基于不同的类型系统. 例如,.NET Framework Decimal 结构的最大小数位数为 28,而 SQL Server 的 decima ...
- 56992 vuser_init.c(12): Error: Socket descriptor not found.
Loadrunner 运行场景时提示" vuser_init.c(12): Error: Socket descriptor not found. Hint: the problem mi ...