• Android初级教程:Android中解析方式之pull解析


    在安卓中有很多种解析方式。按照大方向有xml解析和json解析。而,细致的分,xml和json解析各有自己的很多解析方式。今天这一篇主要介绍xml解析中的pull解析。对于xml的解析方式,我之前在javaweb一些知识中有写过dom和dom4j等等解析方式。有兴趣的读者可以去javaweb篇里面找相关的内容。

    先自定义一个数据源,假设就是访问服务器返回的xml数据文件名称为weather.xml:

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <weather>
    	<city>
    		<name>北京</name>
    		<temp>5°</temp>
    		<pm>80</pm>
    	</city>
    	<city>
    		<name>西安</name>
    		<temp>-5°</temp>
    		<pm>800</pm>
    	</city>
    	<city>
    		<name>南京</name>
    		<temp>12°</temp>
    		<pm>60</pm>
    	</city>
    </weather>

    针对此,建立一个javabean,以稍后保存上边的数据。每一个city就代表一个对象。这样更符合面向对象的思想

    在mainactivity中代码完成解析过程:

    package com.itydl.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;
    
    //服务器向客户端传送数据。这些数据一般保存在xml文件中的。因此需要对数据进行解析、
    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){
    		//获取到src文件夹下的资源文件ClassLoader.getResourceAsStream.返回的是InputStream类型的。
    		InputStream is = getClassLoader().getResourceAsStream("weather.xml");
    		
    		//拿到pull解析器对象XmlPullParser是一个接口,不可以new
    		XmlPullParser xp = Xml.newPullParser();
    		//初始化
    		try {
    			xp.setInput(is, "utf-8");//初始化,设置文件的位置流对象(解析目标文件对象)和解析编码格式
    			
    			//获取当前节点的事件类型,因为pull解析是从xml文件第一行头节点往下解析的,“指针”往下移动,标签(节点)不同,事件类型就不同。
    			//通过事件类型的判断,我们可以知道当前节点是什么节点,从而确定我们应该做什么操作
    			int type = xp.getEventType();
    			City city = null;
    			while(type != XmlPullParser.END_DOCUMENT){//xp.END_DOCUMENT
    				//根据节点的类型,要做不同的操作
    				switch (type) {
    				case XmlPullParser.START_TAG:
    					//					获取当前节点的名字
    					if("weather".equals(xp.getName())){
    						//创建city集合对象,用于存放city的javabean
    						cityList = new ArrayList<City>();
    					}
    					else if("city".equals(xp.getName())){
    						//创建city的javabean对象
    						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;
    				case XmlPullParser.END_TAG:
    					if("city".equals(xp.getName())){
    						//把city的javabean放入集合中。三个城市city,解析完一个城市就把那个城市实例放到集合里面去。
    						cityList.add(city);
    					}
    					break;
    
    				}
    				
    				//把指针移动到下一个节点,并返回该节点的事件类型
    				type = xp.next();
    			}
    			
    			for (City c : cityList) {
    				System.out.println(c.toString());
    			}
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    }
    
    运行程序,解析结果如下:


  • 相关阅读:
    游戏开发流程梳理
    游戏主策化项目进度管控
    游戏主策化项目开发流程
    设计思想之时间和成长理论
    各类监听时间整理
    Django:学习笔记(1)——开发环境配置
    CNN学习笔记:目标函数
    Keras实践:手写数字识别
    Keras实践:实现非线性回归
    CNN学习笔记:卷积神经网络
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299620.html
Copyright © 2020-2023  润新知