注意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.printl