文档章节

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

攀爬的小瓜牛
 攀爬的小瓜牛
发布于 2014/09/01 10:53
字数 737
阅读 192
收藏 7

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);  
       }  
   
    }  
  
} 

© 著作权归作者所有

攀爬的小瓜牛
粉丝 5
博文 112
码字总数 63322
作品 0
成都
程序员
私信 提问
Android 使用LayoutInflater.Factory2创建布局

一,解析LayoutInflater运行原理 从创建一个LayoutInflater的方式我们可以知道,LayoutInflater是系统提供的单例对象 关于Inflate方法,主要分为2组,但前2组最终也是通过调用后2组中的某一个...

IamOkay
2015/04/24
533
0
读取Manifest中meta-data扩展元素数据,SAX/XmlPullParser解析XML

> SAX/XmlPullParser解析XML SAX/XmlPullParser解析Mainfest.xml。 xml解析之XmlPullParser解析器- https://blog.csdn.net/zhjianglin/article/details/72353468 Xml解析 - XmlPullParser解析......

desaco
2018/10/31
0
0
android基础知识02——线程安全1:定义及例子

android的UI操作不是线程安全的,同时也只有主线程才能够操作UI,同时主线程对于UI操作有一定的时间限制(最长5秒)。为了能够做一些比较耗时的操作(比如下载、打开大文件等),android提供...

迷途d书童
2012/03/23
810
0
Android高手进阶教程(二十一)之---Android中创建与几种解析xml的方法!

大家好今天我今天给大家讲解一下android中xml的创建以及一些解析xml的常用方法。 首先是创建,我们用XmlSerializer这个类来创建一个xml文件,其次是解析xml文件,常用的有dom,sax,XmlPullPa...

迷途d书童
2012/02/29
306
1
PULL解析XML和SAX解析的区别

如果在一个XML文档中我们只需要前面一部分数据,但是使用SAX方式或DOM方式会对整个文档进行解析,尽管XML文档中后面的大部分数据我们其实都不需要解析,因此这样实际上就浪费了处理资源。使用...

TedYin
2013/11/12
238
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
今天
3
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
7
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部