Android 解析XML之二 SAX

基于事件驱动的api,有两个部分,解析器和事件处理器,解析器就是XMLReader接口,负责读取XML文档,事件处理器发送事件(也是事件源),事件处理器ContentHandler接口,负责对发送的事件响应和进行XML文档处理。

    下面是ContentHandler接口的常用方法

     public abstract void characters (char[] ch, int start, int length)

      这个方法来接收字符块通知,解析器通过这个方法来报告字符数据块,解析器为了提高解析效率把读到的所有字符串放到一个字符数组(ch)中,作为参数传递给character的方法中,如果想获取本次事件中读取到的字符数据,需要使用start和length属性。

    public abstract void startDocument () 接收文档开始的通知

     public abstract void endDocument () 接收文档结束的通知

    public abstract void startElement (String uri, String localName, String qName, Attributes atts) 接收文档开始的标签

    public abstract void endElement (String uri, String localName, String qName) 接收文档结束的标签

    在一般使用中为了简化开发,在org.xml.sax.helpers提供了一个DefaultHandler类,它实现了ContentHandler的方法,我们只想继承DefaultHandler方法即可。

   另外SAX解析器提供了一个工厂类:SAXParserFactory,SAX的解析类为SAXParser 可以调用它的parser方法进行解析。

package com.demo.xml;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxParserHelper extends DefaultHandler{

	final int COUNT =5;
	List<Site> siteList;
	
	Site site;
    int currState = 0;
    
    public List<Site> getList(){
    	return siteList;
    }

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		String str = String.valueOf(ch,start,length);
		if(currState != 0){
			site.setName(str);
			currState = 0;
		}
	}

	@Override
	public void endDocument() throws SAXException {
		super.endDocument();
		System.out.println("endDocument");
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if(localName.equals("website")){
			siteList.add(site);
		}   
		System.out.println("endElement");
	}

	@Override
	public void startDocument() throws SAXException {
		siteList = new ArrayList<Site>();
		System.out.println("startDocument");
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		site = new Site();
		System.out.println("startElement");
		if(localName.equals("website")){
			for(int i = 0; i < attributes.getLength(); i++){
				if(attributes.getLocalName(i).equals("id")){
					site.setId(attributes.getValue(i));
				}else if(attributes.getLocalName(i).equals("src")){
					site.setSrc(attributes.getValue(i));
				}
			}
			currState = COUNT;
			return;
		}
         currState = 0;
         return;
	}
}

调用函数如下[实现于activity中]:

 //针对SAX解析
	private List<Map<String,String>> getSaxList() throws ParserConfigurationException, SAXException, IOException{
		List<Map<String,String>> list = new ArrayList<Map<String,String>>();
		List<Site> siteList = getSiteList();
		
		for(int i =0; i< siteList.size(); i++){
			Map<String,String> map = new HashMap<String,String>();
			map.put("id", siteList.get(i).getId());
			map.put("src", siteList.get(i).getSrc());
			map.put("name", siteList.get(i).getName());
			list.add(map);
		}
		return list;
	}
	public List<Site> getSiteList() throws ParserConfigurationException, SAXException, IOException{
		SAXParser parser;
		SAXParserFactory factory = SAXParserFactory.newInstance(); //实例化一个 factory对象
		
		parser = factory.newSAXParser();//实例化SAXParser对象,创建XMLReader对象解析器
		XMLReader xmlReader = parser.getXMLReader();
		
		SaxParserHelper helperHandler = new SaxParserHelper(); //实例化handler,事件处理器
		
		xmlReader.setContentHandler(helperHandler); //解析器注册事件
		
		InputStream stream = getResources().openRawResource(R.raw.websites); //读取文件流
		InputSource is = new InputSource(stream);
		xmlReader.parse(is); //解析文件
		return helperHandler.getList();
		
	}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值