android xml-----Pull解析

 

XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument事件。

常用的XML pull的接口和类:
XmlPullParser:该解析器是一个在org.xmlpull.v1中定义的解析功能的接口。
XmlSerializer:它是一个接口,定义了XML信息集的序列。
XmlPullParserFactory:这个类用于在XMPULL V1 API中创建XML Pull解析器。
XmlPullParserException:抛出单一的XML pull解析器相关的错误。
PULL解析器的运行方式和SAX类似,都是基于事件的模式。
不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码:
读取到xml的声明返回 START_DOCUMENT; 结束返回 END_DOCUMENT ; 开始标签返回 START_TAG;
结束标签返回 END_TAG; 文本返回 TEXT。

如代码:

 


import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import com.itcast.domain.City;

public class XMLPullService
{
 
 public static void writeXML(List<City> cities,Writer writer) throws Exception
 {
  XmlSerializer serizalizer =  Xml.newSerializer();
  
  serizalizer.setOutput(writer);
  serizalizer.startDocument("UTF_8", true);//<?xml version="1.0" encoding="UTF-8"?>
  serizalizer.startTag(null,"citys");
  
  for(City city : cities){
   serizalizer.startTag(null,"city");
   serizalizer.attribute(null, "id", String.valueOf(city.getId()));
   serizalizer.startTag(null,"citycode");
   serizalizer.text(city.getCityCode());
   serizalizer.endTag(null,"citycode");
   
   serizalizer.startTag(null,"cityName");
   serizalizer.text(city.getCityName());
   serizalizer.endTag(null,"cityName");
   serizalizer.endTag(null,"city");
  }
  serizalizer.endTag(null,"citys");
  serizalizer.endDocument();
  writer.flush();
  writer.close();
  
 }
 /**
  * 采用Pull解析器解析xml文件
  * @param inStream
  * @return
  * @throws Exception
  */
 public static  List<City> readXml(InputStream inStream) throws Exception
 {
  List<City>cities = null ;
  // 装载解析每一个city节点的内容
  City city = null ;
        // 创建一个xml解析的工厂
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        // 获得xml解析类的引用
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(inStream, "UTF-8");
        // 获得事件的类型
        int eventType = parser.getEventType();
       
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {
            case XmlPullParser.START_DOCUMENT:
                cities = new ArrayList<City>();
                break;
            case XmlPullParser.START_TAG:
                if ("city".equals(parser.getName())) {
                     city = new City();
                    // 取出属性值
                    int id = Integer.parseInt(parser.getAttributeValue(0));
                    city.setId(id);
                }else if (city != null)
    {
                    if ("citycode".equals(parser.getName())) {
                         String cityCode = parser.nextText();// 获取该节点的内容
                         city.setCityCode(cityCode);
                     } else if ("cityName".equals(parser.getName())) {
                         String  cityName = parser.nextText();
                         city.setCityName(cityName);
                     }
    }
                break;
            case XmlPullParser.END_TAG:
                if ("city".equals(parser.getName())  && city != null) {
                    cities.add(city);
                    city = null;
                }
                break;
            }
            eventType = parser.next();//循环解析下一个元素
        }
        return cities;
    }
}

 //调用方法

private void getPullXml()
 {

  try
  {
   InputStream inStream = XmlActivity.this.getAssets().open("city.xml");
   List<City> cities = XMLPullService.readXml(inStream);
   StringBuilder builder = new StringBuilder();
   for (int i = 0; i < cities.size(); i++)
   {
    City city = cities.get(i);
    builder.append("Pull :").append(city.getCityName()).append(" : ").append(city.getCityCode()).append("\n\r");

   }
   result.setText(builder.toString());
  } catch (Exception e)
  {
   Toast.makeText(XmlActivity.this, "解析异常", Toast.LENGTH_SHORT).show();
   e.printStackTrace();
  }
 }

xml 文件请参考 http://blog.csdn.net/onlywaitforyou/article/details/8647653 

City就是一个bean类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值