今天我们一起通过一个小例子来学习一下使用PULL解析器解析XML文件。
(1)首先我们放一个文件名为beauties.xml的XML文件到assets目录下,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beauties>
<beauty>
<name>范冰冰</name>
<age>28</age>
</beauty>
<beauty>
<name>杨幂</name>
<age>23</age>
</beauty>
</beauties>
然后在src目录下写一个与XML中节点(Node)相对应的类Beauty,其内容如下:
package com.pulltest;
public class Beauty {
//美女姓名
private String name;
//美女年龄
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "美女资料 [年龄=" + age + ", 姓名=" + name + "]";
}
}
(2)在src目录下写一个接口IBeautyParser,其内容如下:
package com.pulltest;
import java.io.InputStream;
import java.util.List;
public interface IBeautyParser {
/**
*
* 解析输入流,获取Beauty列表
* @param is
* @return
* @throws Exception
*/
public List<Beauty> parse(InputStream is) throws Exception;
/**
*
* 序列化Beauty对象集合,得到XML形式的字符串
* @param beauties
* @return
* @throws Exception
*/
public String serialize(List<Beauty> beauties) throws Exception;
}
在src目录下写一个上面接口的实现类BeautyParserImpl,其内容如下,代码已经详细注释:
package com.pulltest;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
public class BeautyParserImpl implements IBeautyParser{
@Override
public List<Beauty> parse(InputStream is) throws Exception {
List<Beauty> mList = null;
Beauty beauty = null;
// 由android.util.Xml创建一个XmlPullParser实例
XmlPullParser xpp = Xml.newPullParser();
// 设置输入流 并指明编码方式
xpp.setInput(is,"UTF-8");
// 产生第一个事件
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT){
switch (eventType) {
// 判断当前事件是否为文档开始事件
case XmlPullParser.START_DOCUMENT:
mList = new ArrayList<Beauty>(); // 初始化books集合
break;
// 判断当前事件是否为标签元素开始事件
case XmlPullParser.START_TAG:
if (xpp.getName().equals("beauty")) { // 判断开始标签元素是否是book
beauty = new Beauty();
} else if (xpp.getName().equals("name")) {
eventType = xpp.next();//让解析器指向name属性的值
// 得到name标签的属性值,并设置beauty的name
beauty.setName(xpp.getText());
} else if (xpp.getName().equals("age")) { // 判断开始标签元素是否是book
eventType = xpp.next();//让解析器指向age属性的值
// 得到age标签的属性值,并设置beauty的age
beauty.setAge(xpp.getText());
}
break;
// 判断当前事件是否为标签元素结束事件
case XmlPullParser.END_TAG:
if (xpp.getName().equals("beauty")) { // 判断结束标签元素是否是book
mList.add(beauty); // 将book添加到books集合
beauty = null;
}
break;
}
// 进入下一个元素并触发相应事件
eventType = xpp.next();
}
return mList;
}
@Override
public String serialize(List<Beauty> beauties) throws Exception {
// TODO Auto-generated method stub
return null;
}
}
(3) 在layout目录下新建一个布局文件pulltest.xml,其内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
在src目录下的Activity内容如下:
package com.pulltest;
import java.io.InputStream;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import com.example.pulltest.R;
public class PullTestActivity extends Activity{
//装载Beauty类型的链表,其内容由XML文件解析得到
private List<Beauty> beautyList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pulltest);
try {
//通过assertmanager的open方法获取到beauties.xml文件的输入流
InputStream is = this.getAssets().open("beauties.xml");
//初始化自定义的实现类BeautyParserImpl
BeautyParserImpl pbp = new BeautyParserImpl();
//调用pbp的parse()方法,将输入流传进去解析,返回的链表结果赋给beautyList
beautyList = pbp.parse(is);
} catch (Exception e) {
e.printStackTrace();
}
setupViews();
}
/**
* 将数据显示到手机界面上
*/
private void setupViews(){
String result = "";
for (Beauty b : beautyList) {
result += b.toString();
}
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(result);
}
}
我们右键运行一下android project,结果截图如下:
完整的实例代码下载地址: