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文件的更多相关文章

  1. 安卓开发之利用XmlPullParser解析XML文件

    package com.lidaochen.phonecall; import android.support.v7.app.AppCompatActivity; import android.os. ...

  2. 【Android】使用Pull生成/解析XML文件

    一.生成XML文件,即是将对象集合转为XML文件存储. 对象集合 –> XML(序列化) Android中使用android.util.Xml类对其进行了描述,提供相应的API. 步骤大致如下: ...

  3. Android开发学习之反编译APK文件

    反编译的目的在于学习一些优秀的Android应用程序代码. 在进行反编译之前,需要准备好下面的软件工具(这些文件都放在同一文件下): 这些工具的下载地址:http://down.51cto.com/d ...

  4. Android中的几种解析XML文件的类

    Ø DOM解析 优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点. 3.DOM解析器的API在使用上也相对比较简单. 缺点:如 ...

  5. ios开发学习--歌词处理--解析lrc文件

    我觉得要想解析lrc 首先大家应该了解一下lrc文件的结构,大家可以去看一下**百科 我这里粗略的写一下: ■ 时间标签(Time-tag) 形式为"[mm:ss]"(分钟数:秒数 ...

  6. Excel开发学习笔记:读取xml文件及csv文件

    遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. ).Split(  ...

  7. Android pull解析xml文件

    本文介绍android中使用pull来解析xml文件 先自己写一个xml文件,存一些天气信息 <?xml version="1.0" encoding="UTF-8 ...

  8. 在iOS 开发中用GDataXML(DOM方式)解析xml文件

    因为GDataXML的内部实现是通过DOM方式解析的,而在iOS 开发中用DOM方式解析xml文件,这个时候我们需要开启DOM,因为ios 开发中是不会自动开启的,只有在mac 开发中才自动开启的.我 ...

  9. 【Android学习笔记】XmlResourceParser解析xml文件

    最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...

随机推荐

  1. 开发android App干坏事(二)-wifi控制

    本来今天打算换个话题的,鉴于昨天android篇反响还不错,最近也是在做这方面的东西,今天聊聊一个新的android的发现-wifi的控制(好吧,其实也不能说是坏事,只是觉得wifi安全还是要引起警示 ...

  2. http请求提交cookie

    package leadsServerTest;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient ...

  3. How secure FB Messenger is?

    It's reported that FB Messenge is the most secure App for instant messaging service. Let's see if FB ...

  4. js闭包,匿名函数概念

    var functionName = function(arg){ //函数体 }; 匿名函数:创建一个函数,并将它赋值给一个变量,这种情况下创建的函数叫做匿名函数,因为function关键字后面没有 ...

  5. mysql数据引擎的概念介绍

    什么是数据库引擎?每种数据库的数据格式,内部实现机制都是不同的,要利用一种开发工具访问一种数据库,就必须通过一种中介程序,这种开发工具与数据库之间的中介程序就叫数据库引擎. 如果你是个赛车手并且按一下 ...

  6. Linux 之HTTP服务,APACHE

    1.基础知识 HTTP:超文本传输协议,超链接URI:Uniform Resource Identifier,全局范围内唯一命名符MIME:Multipurpose Internet Mail Ext ...

  7. iOS图片模糊效果与阴影效果

    /** 添加图片模糊效果 @parms  要添加模糊效果的view @return */ + (UIVisualEffectView *)addVisualEffectViewWithView:(UI ...

  8. 关于Comparable与Comparator

    首先说明一下这两个都是用来排序的, 只是应用起来有点差别而已. 有以下情景: 对于 List<String> list = new ArrayList<String>(); 我 ...

  9. 关于odbc的彻底删除问题

    最近在装一个软件,由于第一次安装产生了一个错误,于是我尝试在卸载之后,重新进行安装~但是,在安装过程当中出现了一个问题. NEWLRE ODBC data source already exists. ...

  10. 提高你css技能的css开发技巧(转载)

    一.resize实现图片对比 resize的语法如下: resize:none | both | horizontal | vertical 案例效果如下图 (鼠标移到左下角白色区域,往右侧拖动,实现 ...