• 抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析


    三种解析方法 DOM,SAX,XMLPullParse;你以为我要讲三种嘛 错 ,我只讲一种 ,其他两种我只是说下优缺点,

    一、DOM解析器

    优点:

    DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。Node对象提供了一系列常量来代表结点的类型
    ,当开发人员获得某个Node类型后,就可以把Node节点转换成相应节点对象(Node的子类对象),以便于调用其特有的方法。
     Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容.

     缺点:


     一次性的完全加载整个xml文件,需要消耗大量的内存。

    二、SAX

    优点:SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

    三 、 PullParse

    Pull解析xml文件步骤:


    1.先自己写一个xml文件,存一些天气信息


    ###拿到xml文件

    InputStream is = getClassLoader().getResourceAsStream("weather.xml");


    ###拿到pull解析器

    XmlPullParser xp = Xml.newPullParser();

    2.开始解析
    拿到指针所在当前节点的事件类型

    int type = xp.getEventType();
     事件类型主要有五种
    START_DOCUMENT:xml头的事件类型
    END_DOCUMENT:xml尾的事件类型
    START_TAG:开始节点的事件类型
    END_TAG:结束节点的事件类型
    TEXT:文本节点的事件类型

    如果获取到的事件类型不是END_DOCUMENT,就说明解析还没有完成,如果是,解析完成,while循环结束

    while(type != XmlPullParser.END_DOCUMENT)
    当我们解析到不同节点时,需要进行不同的操作,所以判断一下当前节点的name
    当解析到weather的开始节点时,new出list
    当解析到city的开始节点时,创建city对象,创建对象是为了更方便的保存即将解析到的文本
    当解析到name开始节点时,获取下一个节点的文本内容,temp、pm也是一样

    case XmlPullParser.START_TAG:
    //获取当前节点的名字
    if("weather".equals(xp.getName())){
    citys = new ArrayList<City>();
    }
    else if("city".equals(xp.getName())){
    city = new City();
    }
    else if("name".equals(xp.getName())){
    //获取当前节点的下一个节点的文本
    String name = xp.nextText();
    city.setName(name);
    }
    else if("temp".equals(xp.getName())){
    String temp = xp.nextText();
    city.setTemp(temp);
    }
    else if("pm".equals(xp.getName())){
    String pm = xp.nextText();
    city.setPm(pm);
    }
    break;

     当解析到city的结束节点时,说明city的三个子节点已经全部解析完了,把city对象添加至list

    case XmlPullParser.END_TAG:
    if("city".equals(xp.getName())){
    citys.add(city);
    }

    随便写个XML:

    <?xml version="1.0" encoding="utf-8"?>
    <weather>
        <city>
            <name>安阳</name>
            <temp>-8℃</temp>
            <pm25>120</pm25>
        </city>
        <city>
            <name>北京</name>
            <temp>-12℃</temp>
            <pm25>500</pm25>
        </city>
        <city>
            <name>上海</name>
            <temp>2℃</temp>
            <pm25>60</pm25>
        </city>
    </weather>

    定义一个JavaBean 来装name temp pm25:

    package com.ace.pullparser;
    
    public class City {
    
        private String name;
        private String temp;
        private String pm25;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getTemp() {
            return temp;
        }
        public void setTemp(String temp) {
            this.temp = temp;
        }
        public String getPm25() {
            return pm25;
        }
        public void setPm25(String pm25) {
            this.pm25 = pm25;
        }
        @Override
        public String toString() {
            return "City [name=" + name + ", temp=" + temp + ", pm25=" + pm25 + "]";
        }
        
        
    }

    MainActivity:

    package com.ace.pullparser;
    
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    
    import com.itheima.pullparser.domain.City;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.util.Xml;
    import android.view.Menu;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        List<City> cityList;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            
        }
        
        public void click(View v){
            //获取天气信息xml文件(不用创建后台,把你创建的xml放到src目录下,getClassLoader().getResourceStream是读取src目录下文件的方法)
            InputStream is = getClassLoader().getResourceAsStream("weather.xml");
            
            //获取xmlpull解析器
            XmlPullParser xp = Xml.newPullParser();
            try {
                //初始化
                xp.setInput(is, "gbk");
                
                //获取当前节点的事件类型
                int type = xp.getEventType();
                City city = null;
                while(type != XmlPullParser.END_DOCUMENT){
                    switch (type) {
                    case XmlPullParser.START_TAG:
                                        //获取当前节点的名字
                        if("weather".equals(xp.getName())){
                            cityList = new ArrayList<City>();
                        }
                        else if("city".equals(xp.getName())){
                            city = new City();
                        }
                        else if("name".equals(xp.getName())){
                                            //获取下一个节点的文本
                            String name = xp.nextText();
                            city.setName(name);
                        }
                        else if("temp".equals(xp.getName())){
                            //获取下一个节点的文本,把指针移动至当前节点的结束节点
                            String temp = xp.nextText();
                            city.setTemp(temp);
                        }
                        else if("pm25".equals(xp.getName())){
                            //获取下一个节点的文本
                            String pm25 = xp.nextText();
                            city.setPm25(pm25);
                        }
                        break;
                    case XmlPullParser.END_TAG:
                        if("city".equals(xp.getName())){
                            cityList.add(city);
                        }
                        break;
    
                    }
                    //把指针移动至下一个节点,并返回该节点的事件类型
                    type = xp.next();
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            for (City city : cityList) {
                System.out.println(city.toString());
            }
        }
    
    
        
    }

    布局只有一个Button 

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="获取天气信息" 
            android:onClick="click"
            />

    虽然很基础 但我慢慢写 把知识分享给大家 自己也复习了 很好很棒 所以我会坚持的

  • 相关阅读:
    JSDeferred 源码分析
    前端MVVM框架avalon揭秘
    前端MVVM框架avalon揭秘
    轻量级前端MVVM框架avalon源码分析-总结
    JavaScript 中介者模式与观察者模式有何不同?
    Knockout 新版应用开发教程之"text"绑定
    Knockout 新版应用开发教程之"visible"绑定
    Knockout 新版应用开发教程之Observable Arrays
    设计模式之美:Decorator(装饰)
    设计模式之美:Composite(组合)
  • 原文地址:https://www.cnblogs.com/AceIsSunshineRain/p/5170317.html
Copyright © 2020-2023  润新知