PULL解析XML文件的步骤:
1, 导包
2, 创建pull解析器工厂
3, 创建解析器对象
4, 设置解析的数据源(要解析的内容)
5, 获取事件的类型(int)
6, 循环解析, 直到文档解析完成
解析实例:
XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student >
<id>1</id>
<name>zhangsan</name>
<age>20</age>
<sex>male</sex>
</student>
<student >
<id>2</id>
<name>lisi</name>
<age>21</age>
<sex>female</sex>
</student>
</students>
Student类:
public class Student {
private int id;
private String name;
private String age;
private String sex;
public int getId() {
return id;
}
public void setId(int 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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
public static void main(String[] args) throws XmlPullParserException, IOException {
//1, 导包
//2, 得到Pull解析器工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//3, 得到Pull解析器
XmlPullParser parser = factory.newPullParser();
//4, 指定要解析的文件
parser.setInput(new FileReader("XML文件路径"));
//5, 获取事件的状态类型
int type = parser.getEventType();
//获取当前解析标签的名称
String tag = null;
//数据集合
ArrayList<Student> list = null;
//当前"组装"数据的对象
Student student = null;
//6, 循环解析, 直到文档结束
while (type!=XmlPullParser.END_DOCUMENT) {
//获取标签名称
tag = parser.getName();
switch(type)
{
case XmlPullParser.START_DOCUMENT://文档的开始
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG://标签的开始
if("student".equals(tag))
{
student = new Student();
}
else if("id".equals(tag))
{
String str = parser.nextText();
student.setId(Integer.parseInt(str));
}else if("name".equals(tag))
{
String str = parser.nextText();
student.setName(str);
}else if("age".equals(tag))
{
String str = parser.nextText();
student.setAge(str);
}else if("sex".equals(tag))
{
String str = parser.nextText();
student.setSex(str);
}
break;
case XmlPullParser.END_TAG:
if("student".equals(tag))//</students>
{
list.add(student);
}
break;
}
//获取下一个事件的类型, 不写就死循环了!! 一定要写的
type = parser.next();
}
for(Student s:list)
{
System.out.println(s);
}
}
}
但是XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1">
<name>zhangsan</name>
<age>20</age>
<sex>male</sex>
</student>
<student id="2">
<name>lisi</name>
<age>21</age>
<sex>female</sex>
</student>
</students>
修改为:
public class DemoPull02 {
/**
* @param args
* @throws XmlPullParserException
* @throws IOException
*/
public static void main(String[] args) throws XmlPullParserException, IOException {
// 解析器工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//解析器
XmlPullParser parser = factory.newPullParser();
//设置数据源
parser.setInput(new FileReader("XML文件路径"));
//获取事件的类型
int type = parser.getEventType();
String tag = null;
ArrayList<Student> list = null;
Student student = null;
//循环解析, 直到文档结束
while (type!=XmlPullParser.END_DOCUMENT) {//值为: 1
tag = parser.getName();
switch (type) {
case XmlPullParser.START_DOCUMENT://值为: 0
list = new ArrayList<>();
break;
case XmlPullParser.START_TAG://值为: 2
if("student".equals(tag))
{
//实例化student
student = new Student();
//获取属性
int count = parser.getAttributeCount();
for(int i=0;i<count;i++)
{
String attName = parser.getAttributeName(i);
String attValue = parser.getAttributeValue(i);
if("id".equals(attName))//如果属性名称为id , 那么需要在student中设置id
{
student.setId(Integer.parseInt(attValue));
}
}
//如果确定只要一个id
// student.setId(Integer.parseInt(parser.getAttributeValue(0)));
}else if("name".equals(tag))
{
String str = parser.nextText();
student.setName(str);
}else if("age".equals(tag))
{
String str = parser.nextText();
student.setAge(str);
}else if("sex".equals(tag))
{
String str = parser.nextText();
student.setSex(str);
}
break;
case XmlPullParser.END_TAG://值为: 3
if("student".equals(tag))
{
list.add(student);
}
break;
}
//获取下一个事件, 防止死循环
type = parser.next();
}
for(Student s:list)
{
System.out.println(s);
}
}
}