Pull解析Xml文件

好久没有解析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'}]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值