Android中XML解析之XMLPullParser解析

来源:互联网 发布:windows系统安装u盘 编辑:程序博客网 时间:2024/06/16 06:41
        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.println(list.size()+ "");

                                    for(int i = 0; i < 4; i++) {

                                              System.out.println(list.get(i).getId());

                                    }

                                    showParserContent();

                                    break;

                           }

                  }

 

                  privatevoid showParserContent() {

                           mLvPull.setAdapter(newAppAdapter(MainActivity.this, list));

                  };

 

        };

 

        @Override

        protectedvoid onCreate(Bundle savedInstanceState) {

                  super.onCreate(savedInstanceState);

                  setContentView(R.layout.activity_main);

 

                  mObtain= (Button) findViewById(R.id.mainAc_btn_Obtain);

                  mPull= (Button) findViewById(R.id.mainAc_btn_Pull);

 

                  mTvShowObtain= (TextView) findViewById(R.id.mainAc_tv_showContent);

                  mLvPull= (ListView) findViewById(R.id.mainAc_lv_showPullParserContent);

 

                  mObtain.setOnClickListener(this);

                  mPull.setOnClickListener(this);

        }

 

        @Override

        publicvoid onClick(View v) {

                  switch(v.getId()) {

                  caseR.id.mainAc_btn_Obtain:

                           //在子线程中,获取服务器上的xml文件

                           newThread(new Runnable() {

                                    @Override

                                    publicvoid run() {

                                              mResult= getXML();

                                              //发送handler处理消息

                                              if(mResult == null || "".equals(mResult)) {

                                                       mHandler.sendEmptyMessage(0);

                                              }else {

                                                       mHandler.sendEmptyMessage(1);

                                              }

                                    }

                           }).start();

                           break;

                  caseR.id.mainAc_btn_Pull:

                           parserXML();

                           mHandler.sendEmptyMessage(2);

                           break;

                  }

        }

 

        privatevoid parserXML() {

                  if(mResult == null) {

                           newThread(new Runnable() {

                                    @Override

                                    publicvoid run() {

                                              mResult= getXML();

                                    }

                           }).start();

                  }

 

                  try{

                           //解析器采用工厂模式设计根据源码看出使用的是多例模式

                           //获得XML PullParser解析器工厂

                           XmlPullParserFactoryxmlPullParserFactory = XmlPullParserFactory

                                              .newInstance();

                           XmlPullParserxmlPullParser = xmlPullParserFactory.newPullParser();

                           xmlPullParser.setInput(newStringReader(mResult));

                           list= new ArrayList<App>();

                           Appapp = null;

                           while(xmlPullParser.getEventType() != XmlPullParser.END_DOCUMENT) {

                                    try{

                                              switch(xmlPullParser.getEventType()) {

                                              caseXmlPullParser.START_DOCUMENT:

                                                       break;

                                              caseXmlPullParser.START_TAG:

                                                       if(xmlPullParser.getName().equals("app")) {

                                                                app= new App();

 

                                                       }else if (xmlPullParser.getName().equals("id")) {

                                                                app.setId(xmlPullParser.nextText());

                                                       }else if (xmlPullParser.getName().equals("name")) {

                                                                app.setName(xmlPullParser.nextText());

                                                       }else if (xmlPullParser.getName().equals("version")) {

                                                                app.setVersion(xmlPullParser.nextText());

                                                       }

                                                       break;

                                              caseXmlPullParser.END_TAG:

                                                       if(xmlPullParser.getName().equals("app")) {

                                                                list.add(app);

                                                       }

                                                       break;

                                              }

                                              xmlPullParser.next();

                                    }catch (IOException e) {

                                              e.printStackTrace();

                                    }

                           }

 

                  }catch (XmlPullParserException e) {

                           e.printStackTrace();

                  }

        }

 

        //获取服务器上的xml文件的方法

        publicString getXML() {

                  Stringresult = null;

                  //注意,这儿的ip必须是IPv4地址,不能是Localhost127.0.0.1

                  HttpGethttpGet = new HttpGet("http://192.168.15.196/app.xml");

                  //实例化HttpClient对象

                  HttpClienthttpClient = new DefaultHttpClient();

                  //连接

                  try{

                           HttpResponsehttpResponse = httpClient.execute(httpGet);

                           Log.v("code",httpResponse.getStatusLine().getStatusCode() + "");

                           //判断是否连接成功

                           if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

                                    //获取Http连接实例

                                    HttpEntityhttpEntity = httpResponse.getEntity();

                                    //获取数据

                                    result= EntityUtils.toString(httpEntity, "UTF-8");

                           }

                  }catch (ClientProtocolException e) {

                           e.printStackTrace();

                  }catch (IOException e) {

                           e.printStackTrace();

                  }finally {

                           httpClient.getConnectionManager().shutdown();

                  }

                  returnresult;

        }

}

main_activity.xml代码:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:orientation="vertical"

   tools:context=".MainActivity">

 

   <Button

       android:id="@+id/mainAc_btn_Obtain"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:text="获取XML文件"/>

 

   <TextView

       android:id="@+id/mainAc_tv_showContent"

       android:layout_width="match_parent"

       android:layout_height="0dp"

       android:layout_weight="1"

       android:scrollbars="vertical"

       android:text="SADF"/>

 

   <Button

       android:id="@+id/mainAc_btn_Pull"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:text="Pull解析获取的XML文件"/>

 

   <ListView

       android:id="@+id/mainAc_lv_showPullParserContent"

       android:layout_width="match_parent"

       android:layout_height="0dp"

       android:layout_weight="1">

   </ListView>

 

</LinearLayout>

item_mainactivity_layout.xml项布局:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   android:orientation="vertical">

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:orientation="horizontal">

 

       <TextView

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="id:"/>

 

       <TextView

           android:id="@+id/item_mainAc_id"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"/>

   </LinearLayout>

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:orientation="horizontal">

 

       <TextView

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="name:"/>

 

       <TextView

           android:id="@+id/item_mainAc_name"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"/>

   </LinearLayout>

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:orientation="horizontal">

 

       <TextView

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:text="version:"/>

 

       <TextView

           android:id="@+id/item_mainAc_version"

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"/>

   </LinearLayout>

 

</LinearLayout>


App.java(bean)代码:


 


import java.io.Serializable;


 


 


publicclassAppimplementsSerializable {


 private Stringid;


 private Stringname;


 private Stringversion;


 


 public App() {


 


 }


 


 public App(String id, Stringname, String version) {


    this.id = id;


    this.name = name;


    this.version = version;


 }


 


 public String getId() {


    returnid;


 }


 


 publicvoid setId(String id) {


    this.id = id;


 }


 


 public String getName() {


    returnname;


 }


 


 publicvoid setName(String name) {


    this.name = name;


 }


 


 public String getVersion() {


    returnversion;


 }


 


 publicvoid setVersion(Stringversion) {


    this.version = version;


 }


 


}


 


AppAdapter.java代码:

import java.util.List;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.TextView;


public class AppAdapter extends BaseAdapter{


        privateContext mCtx;

        privateList<App> mList;

        privateLayoutInflater mInflater;


        publicAppAdapter(Context context, List<App> list) {

                  mCtx= context;

                  mList= list;

        }

        @Override


        publicint getCount() {

                  returnmList.size();

        }

        @Override

        publicObject getItem(int position) {

                  returnmList.get(position);

        }

        @Override

        publiclong getItemId(int position) {

                  returnposition;

        }

        @Override

        publicView getView(int position, View convertView, ViewGroup parent) {

                  mInflater= LayoutInflater.from(mCtx);

                  convertView= mInflater.inflate(R.layout.item_mainactivity_layout, parent,false);

                  TextViewid = (TextView) convertView.findViewById(R.id.item_mainAc_id);

                  TextViewname = (TextView) convertView

                                    .findViewById(R.id.item_mainAc_name);

                  TextViewversion = (TextView) convertView

                                    .findViewById(R.id.item_mainAc_version);


                  id.setText(mList.get(position).getId());

                  name.setText(mList.get(position).getName());

                  version.setText(mList.get(position).getVersion());


                  returnconvertView;

        }


 


}


 


最后,记得加网络权限。




0 0
原创粉丝点击