您的位置:首页 > 移动开发 > Android开发

Android中XML解析之XMLPullParser解析

2015-08-26 08:48 585 查看
        XML解析包含几种方式,本文介绍XML解析之XMLPullParser解析。该解析主要用到XMLPullParser类。下面首先对该类进行讨论,然后举出一个使用实例。
    注意XmlPullParser是一个接口,也就是说我们不能直接通过new
来得到它的一个实例。那怎么办呢?它有一个工厂类XMLPullParserFactory,可以用来获得XMLPullParser类类型的对象。也就是说,使用XmlPullParser解析实际上使用了简单工厂的设计模式。并且在得到XmlPullParser对象时,还使用了反射机制。具体的来看类图结构:



    可见客户端拥有一个XMLPullParserFactory实例,该类自身也简化的工厂模式设计,即自己创建自己的实例,它并没有公共的构造器,从源码中可以看到其构造器只具有包访问权限(protected
 XmlPullParserFactory())【当然,采用工厂模式设计的好处是不用说的,如果不知可以看设计模式部分,这里不重点说了!】。同时XMLPullParserFactory的newPullParser()也不是通过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地址,不能是Localhost
或127.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代码:

<LinearLayout
xmlns: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项布局:

<?xml
version="1.0"encoding="utf-8"?>

<LinearLayout
xmlns: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;

 

 

public
classApp
implementsSerializable {

 
private String
id;

 
private String
name;

 
private String
version;

 

 
public App() {

 

 
}

 

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

    
this.id
= id;

    
this.name
= name;

    
this.version
= version;

 
}

 

 
public String getId() {

    
return
id;

 
}

 

 
public
void setId(String id) {

    
this.id
= id;

 
}

 

 
public String getName() {

    
return
name;

 
}

 

 
public
void setName(String name) {

    
this.name
= name;

 
}

 

 
public String getVersion() {

    
return
version;

 
}

 

 
public
void 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;
        
}

 

}

 

最后,记得加网络权限。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息