zoukankan      html  css  js  c++  java
  • android之xmlpullparse解析器

    Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull。Pull解析和Sax解析不一样的地方有(1)pull读取xml文件后触发相应的事件调用方法返回的是数字(2)pull可以在程序中控制想解析到哪里就可以停止解析。下面看我自己做的demo,来跟大家讲解下:

    xml代码:

    person.xml

    <?xml version="1.0" encoding="UTF-8"?> 
    <persons>
        <person id="20">
            <name>zhangqian</name>
            <age>20</age>
        </person>
        <person id="23">
            <name>zhangmeili</name>
            <age>23</age>
        </person> 
    </persons>
    <?xml version="1.0" encoding="UTF-8"?>  这是xml头文件 也叫做start document
    <persons>这是xml节点(element)  xml节点有两种类型(Node Type)1,element 2,text(就是上个element和下一个element之间称作文本类型)

    通过对XML文件的大致特征,我们首先要建立一个javabean,建在一个domian包下,代码如下
    package com.example.domian;
    
    public class Person {
        
        private Integer id;
        private String name;
        private Integer 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;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
        }
        public Person(Integer id, String name, Integer age) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
        }
        public Person(){}
    
    }

    下面我们要开始处理业务层,对xml文件进行解析了,建在service包下,代码如下

    package com.example.service;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    
    import android.util.Xml;
    
    import com.example.domian.Person;
    
    public class PersonService {
        public static List<Person> getPerson(InputStream xml) throws Exception {
            List<Person> persons =null;
            Person person = null;
            XmlPullParser pullParse = Xml.newPullParser();
            pullParse.setInput(xml,"UTF-8");
            int event = pullParse.getEventType();
            while(event!=XmlPullParser.END_DOCUMENT){
            switch (event) {
            case XmlPullParser.START_DOCUMENT:
                persons = new ArrayList<Person>();
                break;
    
            case XmlPullParser.START_TAG :
                if("person".equals(pullParse.getName())){
                    int id =new Integer(pullParse.getAttributeValue(0));
                    person = new Person();
                    person.setId(id);
                }
                if("name".equals(pullParse.getName())){
                    String name = pullParse.nextText();
                    person.setName(name);
                }
                if("age".equals(pullParse.getName())){
                    int age = new Integer(pullParse.nextText());
                    person.setAge(age);
                }
                
                break;
                
            case XmlPullParser.END_TAG :
                if("person".equals(pullParse.getName())){
                    persons.add(person);
                    person = null;
                }
                
                break;
            }
           event = pullParse.next();
           
          }
            return persons;
        }
    }

    下面我们要对解析的方法是否正确,进行测试,写一个测试类,建立一个test包,代买如下

    package com.example.test;
    
    
    
    import java.io.InputStream;
    import java.util.List;
    
    import com.example.domian.Person;
    import com.example.service.PersonService;
    
    import android.test.AndroidTestCase;
    import android.util.Log;
    
    public class TestPersonService extends AndroidTestCase {
       private static final String TAG = "TestPersonService";
       public void testPerson() throws Exception{
           InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
           List<Person> persons = PersonService.getPerson(xml);
           for(Person person:persons){
               Log.i(TAG, person.toString());
           }
       }
        
    
    }

     要使用android的单元测试,需要在AndroidManifest.xml文件中加入声明,AndroidManifest.xml如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.xml"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="10"
            android:targetSdkVersion="17" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.xml.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <uses-library android:name="android.test.runner"/> //主要配置这条
        </application>
    <instrumentation android:name="android.test.InstrumentationTestRunner" android:label="Tests for My APP" android:targetPackage="com.example.xml"></instrumentation>
    //主要配置这条
    </manifest>

    看JUnit 是否正确,绿色代表成功,红色代表失败

    如图所示 成功!

    看logcat日志,看运行结果!如图

    很高兴和大家分享,如有什么问题及时和我交流,我会尽快回复。版权所有,如转载请注明出处http://www.cnblogs.com/jianrong-zheng/p/3548053.html谢谢!

    
    







  • 相关阅读:
    rpmdb open failed 的解决办法
    centos7 搭建vsftpd服务并锁定用户的家目录
    centos7 搭建samba服务
    python检测是否为数字
    python的random模块
    利用python编写一个简单的猜数字游戏
    在centos7中利用kvm创建虚拟机并设置为桥接模式
    支付宝提现
    冒泡排序(数组排序)
    全选获取对应值
  • 原文地址:https://www.cnblogs.com/jianrong-zheng/p/3548053.html
Copyright © 2011-2022 走看看