首先,介绍一下本文背景。是在看第一行代码中的pull解析方式要下新软件,就懒得下,去网上找资料,但是发现很多博客都没有写完一个例子,没想到花了更多的时间。最后找到一篇完整的博客,自己加上一些批注,在这里记录一下
Pull步骤简单介绍
- 需要建立一个解析器对象XmlPullParser。
- 再使用XmlPullParser.setInput()方法设置解析器的输入。
- 之后再通过判断事件类型,循环调用next()方法获得解析的数据
工程文件截图
student.xml用于放要读的数据
Student是数组的泛型
ParserByPull是一个方法类,在里面实现读取
代码如下
student.xml
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="20110806100">
<name>小明</name>
<age>22</age>
<sex>男</sex>
</student>
<student id="20110806101">
<name>小李</name>
<age>24</age>
<sex>男</sex>
</student>
<student id="20110806102">
<name>小丽</name>
<age>21</age>
<sex>女</sex>
</student>
</students>
Student.class
public class Student {
private String id;
private String name;
private int age;
private String sex;}(get()和set()方法也要,此处省略)
ParserByPull.class
public class ParserByPULL {
//采用XmlPullParser来解析文件
public static List<Student> getStudents(InputStream inputStream)throws Throwable{
List<Student> students=null;
Student mStudent=null;
//创建XmlPullParser
XmlPullParser parser= Xml.newPullParser();
//解析文件输入流
parser.setInput(inputStream,"UTF-8");
//得到当前的解析对象
int eventType=parser.getEventType();
//当解析工作还没完成时,调用next()方法得到下一个解析事件
while (eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType){
case XmlPullParser.START_DOCUMENT:
//解析开始的时候初始化list
students=new ArrayList<>();
break;
case XmlPullParser.START_TAG:
//获得解析器当前指向的元素的名字
//当指向元素的名字和id,name,sex这些属性重合时可以返回他们的值
String XPPname=parser.getName();
if ("student".equals(XPPname)){
//通过解析器获取id的元素值,并设置一个新的Student对象的id
mStudent=new Student();
mStudent.setId(parser.getAttributeValue(0));
}
if (mStudent!=null)
{
if("name".equals(XPPname))
{
//得到当前指向元素的值并赋值给name
mStudent.setName(parser.nextText());
}
if("age".equals(XPPname))
{
//得到当前指向元素的值并赋值给age
mStudent.setAge(new Short(parser.nextText()));
}
if("sex".equals(XPPname))
{
//得到当前指向元素的值并赋值给sex
mStudent.setSex(parser.nextText());
}
}
break;
//出发结束元素事件
case XmlPullParser.END_TAG:
if("student".equals(parser.getName()))
{
students.add(mStudent);
mStudent = null;
}
break;
default:
break;
}
eventType = parser.next();
}
return students;
}
}
MainActivity.class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AssetManager asset=getAssets();
try{
InputStream inputStream=asset.open("student.xml");
List<Student> list=ParserByPULL.getStudents(inputStream);
for (Student stu:list){
Log.e("StudentInfo","Person ID: " + stu.getId() + ","
+ stu.getName() + ", " + stu.getAge() + ", "
+ stu.getSex());
}
}catch (Throwable e){
e.printStackTrace();
}
}
}
结果截图