好久没有解析xml文件了,居然都快忘了,这两天后台居然返回的xml格式的数据,尼玛,好吧,随意在整理整理
一、什么是xml
eXtensiable Markup Language 可扩展标记语言
标记语言:由标签(标记)构成的语言。标记语言不是编程语言
可扩展:所有的标签都是自定义的。没有预定义的
二、xml的作用
做数据存储
作为配置文件
作为数据载体,在网络中传输
解析思想:
DOM:文档对象模型。一次性将xml文档全部加载进内存,在内存中形成一颗dom树型结构。操作dom树形结构,对文档进行增删改查的操作。
优点:可以对文档进行增删改查的所有操作
缺点:耗内存,速度慢。
SAX:基于事件驱动,逐行读取
监听机制:
事件:一件事件
事件源:事件发生的组件
监听器:一个对象,事件发生后会执行该对象的方法
注册监听:给事件源上绑定一个监听器,监听某一个事件的发生。
优点:不占内存,速度快
缺点:只能查询,不能增删改
大概回顾一下直接上代码,毕竟pull解析还是比较简单的
工程目录:
Student类
public class Student {
private String id;
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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 "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
public class MainActivity extends AppCompatActivity {
private InputStream is;
private TextView tvContent;
List<Student> list = null;
Student student = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvContent = (TextView) findViewById(R.id.tv_content);
try {
//获取资产目录下的xml文件
is = this.getAssets().open("students.xml");
} catch (IOException e) {
e.printStackTrace();
}
}
public void parse(View view) {
//解析xml
parseXml();
//将集合展示在TextView上
tvContent.setText(list.toString());
}
private void parseXml() {
//1.创建解析器工厂
XmlPullParserFactory factory = null;
try {
factory = XmlPullParserFactory.newInstance();
//2.获取解析器
XmlPullParser parser = factory.newPullParser();
//3.设置输入流
parser.setInput(new InputStreamReader(is));
//4.获取事件类型
int type = parser.getEventType();
//5.循环判断是否是文档的结束
while (type != XmlPullParser.END_DOCUMENT) {
/**
* 需求:将xml文档中存储的数据封装为Student对象。将对象添加到集合中
*
* 分析:
* 开始标签:
* * students:创建集合
* * student:创建Student对象,并且获取属性值,给对象的id属性赋值
* * name:获取其下一个文本,给对象的name属性赋值
* * age:获取其下一个文本,给对象的age属性赋值
*
* 结束标签:
* * student:将对象添加到集合中
*
*/
//判断事件类型,做出不同的操作
//获取标签名称
String tagName = parser.getName();
switch (type) {
case XmlPullParser.START_TAG:
//判断标签名称是什么?做出不同的操作
if ("students".equals(tagName)) {
//创建集合
list = new ArrayList<>();
} else if ("student".equals(tagName)) {
//创建对象,获取id属性值
student = new Student();
//获取属性值
String id = parser.getAttributeValue(0);
student.setId(id);
} else if ("name".equals(tagName)) {
//获取下一个文本,赋值
String name = null;
try {
name = parser.nextText();
} catch (IOException e) {
e.printStackTrace();
}
student.setName(name);
} else if ("age".equals(tagName)) {
//获取下一个文本,赋值
String age = null;
try {
age = parser.nextText();
} catch (IOException e) {
e.printStackTrace();
}
student.setAge(age);
}
break;
case XmlPullParser.END_TAG:
if ("student".equals(tagName)) {
//装载集合
list.add(student);
}
break;
default:
break;
}
//6.向下走一行,并且重新获取事件类型
try {
type = parser.next();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
}
sdutents.xml
<?xml version="1.0" encoding='utf-8'?>
<students>
<student id="s001">
<name>zz</name>
<age>23</age>
</student>
<student id="s002">
<name>ls</name>
<age>24</age>
</student>
<student id="s003">
<name>ww</name>
<age>25</age>
</student>
</students>
最终解析的数据:
[Student{id='s001', name='zz', age='23'}, Student{id='s002', name='ls', age='24'}, Student{id='s003', name='ww', age='25'}]