Pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如: 开始元素和结束元素事件,使用 parser.next() 可以进入下一个元素并触发相应事件。跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,
首先先在Assets目录下创建file.xml 加入如下的内容
<?xml version="1.0"?>
<records>
<employee>
<name>张飞</name>
<surname>张</surname>
<salary>50000</salary>
</employee>
<employee>
<name>孙权 </name>
<surname>孙</surname>
<salary>60000</salary>
</employee>
<employee>
<name>鲁智深</name>
<surname>鲁</surname>
<salary>70000</salary>
</employee>
</records>
编写activity代码
package com.example.abc.xmlpaserdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class PullActivity extends AppCompatActivity {
private static final String TAG =PullActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sax);
try {
InputStream is = getAssets().open("file.xml");
List<Employee> employees = pull2xml(is);
for(Employee employee:employees){
Log.i(TAG, "onCreate: " +employee.toString());
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
private List<Employee> pull2xml(InputStream is) throws XmlPullParserException, IOException {
List<Employee> list = null;
Employee employee = null;
XmlPullParser parser = Xml.newPullParser();
///初始化xmlPull解析器
parser.setInput(is, "utf-8");
//读取文件的类型
int type = parser.getEventType();
//无限判断文件类型进行读取
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
//开始标签
case XmlPullParser.START_TAG:
if ("records".equals(parser.getName())) {
list = new ArrayList<>();
} else if ("employee".equals(parser.getName())) {
employee = new Employee();
} else if ("name".equals(parser.getName())) {
//获取name值
String name = parser.nextText();
employee.setName(name);
} else if ("surname".equals(parser.getName())) {
//获取nickName值
String surname = parser.nextText();
employee.setSurName(surname);
} else if ("salary".equals(parser.getName())) {
//获取nickName值
String salary = parser.nextText();
employee.setSalary(Integer.parseInt(salary));
}
break;
//结束标签
case XmlPullParser.END_TAG:
if ("employee".equals(parser.getName())) {
list.add(employee);
}
break;
}
//继续往下读取标签类型
type = parser.next();
}
return list;
}
}
效果图: