android访问天气服务01--构建XmlPullParser

Pull模式解析原理:

与SAX解析器模拟相似,也提供了类似的事件驱动.使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

Pull模式解析步骤:

1、 得到一个XmlPullParser对象这里得到XMLPullParser对象的方式有两种:

1)通过Xml这个工具类的.newPullParser()方式得到

   2)通过XmlPullParserFactory工厂创建

//得到XmlPullParserFacotry工厂
[java] view plaincopyprint?

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();  

XmlPullParser xmlparser = factory.newPullParser();

2、 再根据XmlPullParser对象设置输入流和编码格式
[java] view plaincopyprint?

parser.setInput(inputStream, "UTF-8");

3、 然后循环遍历所有的结点可以通过文档开始的代码来判断读入到哪个节点

关于xmlparser.getEventType()其值有:

Start_DOCUMENT:文档开始

END_DOCUMENT:文档结束

START_TAG:开始读标签

END_TAG:标签结束

TEXT:所读的是文本内容

一个简单示例:
[java] view plaincopyprint?

import java.io.IOException;
import java.io.StringReader;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class SimpleXmlPullApp{
     public static void main (String args[])  throws XmlPullParserException, IOException{  

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
       factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();   

        xpp.setInput( new StringReader ( "<foo>Hello World!</foo>" ) );  

        int eventType = xpp.getEventType();  

        while (eventType != XmlPullParser.END_DOCUMENT) {  

         if(eventType == XmlPullParser.START_DOCUMENT) {  

             System.out.println("Start document");  

         } else if(eventType == XmlPullParser.START_TAG) {  

             System.out.println("Start tag "+xpp.getName());  

         } else if(eventType == XmlPullParser.END_TAG) {  

             System.out.println("End tag "+xpp.getName());  

         } else if(eventType == XmlPullParser.TEXT) {  

             System.out.println("Text "+xpp.getText());  

         }
         eventType = xpp.next();
        }
        System.out.println("End document");
    }
}

输出结果:

Start document

Start tag foo

Text Hello World!

End tag foo

还是以上一节的例子:读取XML文件里的内容把这些内容构造成一个Person对象,然后读取这个XML文档里内容将其Person对象添加到一个List集合里

person.xml:
[html] view plaincopyprint?

<?xml version="1.0" encoding="UTF-8"?>
<persons>
       <person id="23">
              <name>李明</name>
              <age>30</age>
       </person>
       <person id="20">
              <name>李向梅</name>
              <age>25</age>
       </person>
</persons>

Person类:
[java] view plaincopyprint?

public class Person {  

    private Integer id;
    private String name;
    private short age;
    public Integer getId() {
       return id;
    }
    public void setId(Integer id) {
       this.id = id;
    }
     public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
     public short getAge() {
       return age;
    }
    public void setAge(short age) {
       this.age = age;
    }
    @Override
    public String toString() {
       return "Person [age=" + age + ", id=" + id + ", name=" + name + "]";
    }
}

业务bean
[java] view plaincopyprint?

public static List<Person> readXml(InputStream inputStream)  

         throws Exception {  

     List<Person> persons=null;  

     // XMLPullParser对象  

     XmlPullParser parser = Xml.newPullParser();  

     //设置输入流和编码  

     parser.setInput(inputStream, "UTF-8");  

     // 文件开始代码  

     int eventCode = parser.getEventType();  

     Person person = null;  

     while (eventCode != XmlPullParser.END_DOCUMENT) {  

         switch (eventCode) {  

         //文档开始  

         case XmlPullParser.START_DOCUMENT:  

            // 初始化  

            persons = new ArrayList<Person>();  

            break;  

         case XmlPullParser.START_TAG: //开始标签  

            if ("person".equals(parser.getName())) {  

               person = new Person();  

               person.setId(Integer.parseInt(parser.getAttributeValue(0)));  

            }  

            else if(person!=null){  

                if ("name".equals(parser.getName())) {  

                   //nextNext()如果下一个元素的内容是文本的时候适合用  

                   person.setName(parser.nextText());  

                }
                else if("age".equals(parser.getName())){
                   person.setAge(new Short(parser.nextText()));  

                }
            }
            break;
         case  XmlPullParser.END_TAG://结束标签  

            if ("person".equals(parser.getName()) && person!=null) {  

                persons.add(person);  

                person=null;//再掷为null  

            }  

            break;       

         }
         // 下一个节点
         eventCode = parser.next();
     }
     return persons;
  }

测试:
[java] view plaincopyprint?

public class SAXPersonServiceTest extends AndroidTestCase {  

     private static final String TAG = "LogTest";  

//PULL方式
    public void testPULLReadXml() throws Exception {  

        System.out.println("testPULLReadXml");  

       InputStream inputStream = SAXPersonServiceTest.class.getClassLoader()  

              .getResourceAsStream("person.xml");  

       List<Person> list = PULLPersonService.readXml(inputStream);  

        System.out.println(list.size());  

       for (Person person : list) {
           System.out.println(person);
       }  

    }  

}
时间: 2024-11-08 23:38:22

android访问天气服务01--构建XmlPullParser的相关文章

Android访问WCF服务(使用json实现参数传递)

经过多日努力, 终于勉强弄明白了Android访问WCF服务的方法. 服务端实现 一, 实现服务. 操作契约 [csharp] view plaincopy [ServiceContract] public interface IService { [OperationContract] [WebInvoke( BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, Reque

Android访问WCF服务

原文链接:http://www.cnblogs.com/VinC/archive/2011/02/24/1964049.html 本章目的: 用Wcf建立可以上Android可以访问的数据服务, 数据传输格式采用比较适合于移动互联网传输的Json格式. 服务的开发流程我们按照 服务契约(ServiceContract), 服务实现(Service), 实体对象模型(Model) 及服务发布的流程来介绍. 由于自己对Http请求的链接认识的比较浅,对于有些问题没法做出清楚明了的解释, Androi

Android推送服务(GCM)----GCM Architectural Overview翻译

GCMArchitectural Overview Google Cloud Messaging for Android (GCM)是一个能够帮助开发者从服务器端发送数据到运行在Android手机上的程序的服务.这个服务提供了一个简单,轻量级的机制使得服务器端可以告诉移动端的程序与服务器端建立直接的联系,来获取更新的程序或者用户的数据.C2DM服务可以处理所有的消息队列的问题并且可以把消息发送到目标机器上运行的目标程序. 简介 GCM的主要特点: 1  它允许第三方的程序服务端发送消息到他们的安

Spring提供的用于访问Rest服务的客户端:RestTemplate实践

什么是RestTemplate? RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率.调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式.ClientHttpRequestFactory接口主要提供了两种实现方式

iOS基础 01 构建HelloWorld,剖析并真机测试

iOS基础 01 构建HelloWorld,剖析并真机测试 前言: 从控制台输出HelloWorld是我们学习各种语言的第一步,也是我们人生中非常重要的一步. 多年之后,我希望我们仍能怀有学习上进的心情,继续以HelloWorld去认识这世界上更多的东西. 本篇以HelloWorld作为切入点,向大家系统介绍什么事iOS应用以及如何使用Xcode创建iOS应用. 目录: 1. 创建HelloWorld工程 1.1. 设计界面 1.2. 真机测试 2. Xcode中的iOS工程模板 2.1. Ap

Android客户端与服务端交互之登陆示例

今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台使用简单的servlet,支持GET或POST.这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功. servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径 我是在myEclipse上创建的一个we

OpenLayers访问WTMS服务及添加Googlemap

1.访问WMS服务 首先需要发布WMS服务,才能进行地图WMS服务访问.这里不说怎么发布WMS服务,直接看怎么调用,代码如下: 代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <htm

memcached演练(2) 访问memcached服务

通过上节<memcached演练(1) 搭建memcached服务>,已经成功在linux虚拟机上安装了memcached服务,并设置了自启动. STAT version 1.4.29 Mem:          1891 主要内容 使用telnet命令行工具,操作memcached服务 使用java spymemcached工具访问memcached服务 监控插入不同数据量的数据,响应时间 监控memcached主机繁忙&清闲对比情况 调整memcached的内存指标,插入相同的数据

Android中的服务

首先感谢 红茶前辈: http://my.oschina.net/youranhongcha 废话只说一句:android aosp源码庞大,是个大草原,要跑马,请看准方向,本文就是个方向 (我不写长文,也不贪多,可能介绍不清楚,然后就这样,写给懂的人看) android既然分为 c世界 和 java世界,那么服务也从这俩方面介绍咯: c世界服务称为本地服务.(service manager service好特殊) java世界服务(就是zygote,不,应该说SystemServer中初始化的