抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来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"
        />

 

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

posted @ 2016-01-29 23:36  阿冰的学习日记  阅读(213)  评论(0编辑  收藏  举报