1.布局页面 activity_main.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"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="解析XML文件"
android:id="@+id/btn"
/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:id="@+id/show"
/>
</LinearLayout>
2.在res的目录下创建一个xml文件夹,并在里面放入一个xml文件
<worid>
<name value="剑士"/>
<name value="枪手"/>
<name value="魔法师"/>
<name value="格斗家"/>
<name value="枪剑士"/>
</worid>
3 . MainActivity.java 主程序
package topteam.com.xmlpull;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
Button btn;
TextView show;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn);
show = findViewById(R.id.show);
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
List<String> list = (List<String>) msg.obj;
for(String va:list){
show.append(va+"\n");
}
break;
}
}
};
/**
* 点击按钮执行解析操作
*/
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//由于有些被解析的XML文档比较大,比较耗费时间,所以创建一个线程去执行耗时的操作
new Thread(){
@Override
public void run() {
try {
List<String> vaList = getParserXml(getResources(), R.xml.user);
Message message = new Message();
message.what=1;
message.obj = vaList;
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
}.start();
}
});
}
/**
* 用Pull解析Xml文本的方法
*
* @param res 获取文档
* @param id 要解析的文档
* @return
* @throws IOException
* @throws XmlPullParserException
*/
private List<String> getParserXml(Resources res, int id) throws IOException, XmlPullParserException {
List<String> valueList = null;
String tagName;
//获得XmlPullParset的解析器
XmlPullParser parser = res.getXml(id);
//Pull解析的本质是SAX解析
int type = parser.getEventType(); //获得文本的类型
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_DOCUMENT: //文档的开始
Log.i("测试", "文档的开始");
valueList = new ArrayList<>();
break;
case XmlPullParser.END_DOCUMENT: //文档的结束
Log.i("测试", "文档的结束");
break;
case XmlPullParser.START_TAG: //标记 node结点的开始
tagName = parser.getName(); //得到标记的名字
//得到属性的值
if (tagName.equals("name")) {
String value = parser.getAttributeValue(0);
valueList.add(value);
Log.i("测试", "标记的开始" + value);
}
break;
case XmlPullParser.END_TAG: //标记 node结点的结束
tagName = parser.getName();
Log.i("测试", "标记的结束" + tagName);
break;
}
type = parser.next();
}
return valueList;
}
}