Android中XML解析之XMLPullParser解析
来源:互联网 发布:windows系统安装u盘 编辑:程序博客网 时间:2024/06/16 06:41
注意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代码:
<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;
}
}
最后,记得加网络权限。
- Android中XML解析之XMLPullParser解析
- Android解析XML之XmlPullParser
- android xml解析之XmlPullParser
- android XmlPullParser解析xml
- android 解析xml -XmlPullParser
- Android-XmlPullParser解析XML
- Android解析XML文档之XmlPullParser
- android解析xml文件之XmlPullParser
- Android之XmlPullParser解析城市列表XML
- android之解析xml(XmlPullParser)
- android中XmlPullParser解析
- Xml、XmlPullparser解析数据Android
- android xml解析 XmlPullParser & XmlSerializer
- xml解析之XmlPullParser解析器
- Android网络编程之三:XmlPullParser解析Xml文件
- Android中采用XmlPullParser解析xml文件异常的问题
- XmlPullParser解析XML文件
- 使用XmlPullParser解析XML
- UITableViewDataSource
- Gephi——如何在geolayout布局下加上地图背景
- VC 编译 设置 代码合集
- 合并链表
- Project facet Java version 1.7 is not supported
- Android中XML解析之XMLPullParser解析
- iOS 导航栏透明 去掉黑线
- 黑马程序员-----Java基础-----IO流-4
- JDBC中的Statement和PreparedStatement的区别
- checkbox单选和全选的ajax操作办法
- 简单且线程安全的两个单例模式java程序
- Vim 语法高亮与自动缩进
- poj 1852 脑洞大开(Ants)
- 【SDOI2014】【BZOJ3534】重建