Android中XML解析之XMLPullParser解析

         XML解析包含几种方式,本文介绍 XML解析之XMLPullParser解析。该解析主要用到XMLPullParser类。下面首先对该类进行讨论,然后举出一个使用实例。

    注意XmlPullParser是一个接口,也就是说我们不能直接通过new 来得到它的一个实例。那怎么办呢?它有一个工厂类XMLPullParserFactory,可以用来获得XMLPullParser类类型的对象。也就是说,使用XmlPullParser解析实际上使用了简单工厂的设计模式。并且在得到XmlPullParser对象时,还使用了反射机制。具体的来看类图结构:



    可见客户端拥有一个XMLPullParserFactory实例,该类自身也简化的工厂模式设计,即自己创建自己的实例,它并没有公共的构造器,从源码中可以看到其构造器只具有包访问权限(protected  XmlPullParserFactory())【当然,采用工厂模式设计的好处是不用说的,如果不知可以看设计模式部分,这里不重点说了!】。同时XMLPullParserFactorynewPullParser()也不是通过new XmlPullParser()【这是不可能的,前面说了XmlPullParser是接口类型的】来得到XmlPullParser。在XmlPullParserFactory的构造器中通过Class.forName("org.kxml2.io.KXmlParser")得到KXmlParser类,在调用newPullParser()时,通过Class类的newInstance()public TnewInstance())来获得KXmlParser类的实例。KXmlParser类本身并没有构造器。【其实从这儿可以看出,我们获得一个类的实例的两条途径(并不只有new一种方式哦)】


    上面对使用XMLPullParser解析XML的两个类的设计架构做了探讨。接下来我们再看看实际的使用。

         1 获取XMLPullParser类型的对象

        2 获取要解析的XML文件,XMLPullParser提供了两个方法以不同的形式获得:

                setInput(Reader in) 可以接收缓冲好的字符串等

               setInput(InputStream inputStream, String inputEncoding) 直接以字节输入流处理,并指定编码集

        3 得到事件类型通过 getEventType() next() nextToken() [next()nextToken()的区别是对值为空白标签的处理方式不同,next()会做忽略处理]

        4 通过一个while循环来判断正在解析的是哪一类标签【文档开始START_DOCUMENT ,标签开始START_TAG       文本TEXT ,结束标签END_TAG ,文档结束 END_DOCUMENT

       5 判断标签的含义,即获得标签的名字,通过getName()做判断,以获取我们想要内容,并可以把它还原成对象。

      6 循环结束后,将setInput方法置为空,以释放其所占有的缓冲区。编写更有效率的程序。

      7通过以上步骤解析就完成了。接下来就是显示的工作,显示的方式是多种多样的。


    下面是一个具体的例子:

    通过网络访问Apache服务器上的myxml.xml文件【不会搭服务器的可以看搭建集群中的博文】,并用一个ListView显示。

MainActivity.java代码:

import java.io.IOException;

import java.io.Reader;

import java.io.StringReader;

import java.nio.CharBuffer;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.HttpStatus;

importorg.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

importorg.apache.http.client.methods.HttpGet;

importorg.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

import org.xmlpull.v1.XmlPullParser;

importorg.xmlpull.v1.XmlPullParserException;

import org.xmlpull.v1.XmlPullParserFactory;

 

 

 

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ListView;

import android.widget.TextView;

import android.widget.Toast;

 

public class MainActivity extends Activityimplements OnClickListener {

         //declare member variation

         privateButton mObtain;

         privateButton mPull;

         privateTextView mTvShowObtain;

         privateListView mLvPull;

 

         privateString mResult = null;

 

         privatestatic final int OBTAIN_XML_FAIL = 0;

         privatestatic final int OBTAIN_XML_SUCCESS = 1;

         privatestatic final int PULL_XML_SUCCESS = 2;

         privatestatic final int PULL_XML_FAIL = 3;

         privatestatic final String FAIL_MESSAGE = "获取XML文件失败";

 

         privateList<App> list;

 

         privateHandler mHandler = new Handler() {

                   publicvoid handleMessage(android.os.Message msg) {

                            switch(msg.what) {

                            caseOBTAIN_XML_FAIL:// 获取XML失败

                                     mTvShowObtain.setText(FAIL_MESSAGE);

                                     break;

                            caseOBTAIN_XML_SUCCESS:// 获取XML成功

                                     mTvShowObtain.setText(mResult);

                                     break;

 

                            casePULL_XML_SUCCESS:// 解析XML成功

 

                                     System.out.printl

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值