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

更多相关文章

  1. Android(安卓)椭圆路径 长按暂停动画的实现
  2. Android利用Soap读取WebService并且解析XML的DataSet数据
  3. Android调用 .Net Core WebApi 返回数据,用FastJSON解析一直报错
  4. Android(安卓)selinux配置和用法
  5. Android(安卓)Base64加密解密
  6. Android(安卓)中的日志工具类
  7. Android(安卓)fragment生命周期解析
  8. Android(安卓)android.intent.category解析
  9. 如何控制android中ImageView的位置

随机推荐

  1. Spring Data REST 远程代码执行漏洞(CVE-2
  2. 日产汽车源码遭泄露
  3. 孵化业务快速落地与优化
  4. iPhone X 刘海打理指北
  5. 封杀两年后,GitHub恢复伊朗开发者使用权限
  6. 美团点评酒店后台故障演练系统
  7. Mozilla正在修改Firefox UI,计划5月份公布
  8. 即时配送的订单分配策略:从建模和优化
  9. 客户端自动化测试研究
  10. 【直播】美团点评技术沙龙Online005: 臧