chenshiqiang1202 / EasySaxParser

简化sax解析

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

EasySaxParser

概述

dom解析占用内存大,也需要引入第三方库,所以使用相对于节省内存很多的sax解析是很好的选择。因为sax解析要麻烦很多,所以整理了一个简化android sax解析的一个工具。

实现思路:和Android Touch事件传递机制一样,把需要子解析器解析的节点往下传递。

如果有进一步简化的方法,欢迎交流!



## 使用
**abstract class SaxParser需要子类实现的方法:**
/**
 * 节点解析开始
 */
public abstract void parserStart(Attributes attributes);
/**
 * 一个子节点解析结束
 * @param value characters获得的值
 */
public abstract void parserElementEnd(String qName, String value);
/**
 * 解析事件需要向下传递,返回需要传递的子SaxParser
 */
public abstract SaxParser dispatchTo(String qName, Attributes attributes);
/**
 * 节点解析结束
 */
public abstract void parserEnd();

**开始解析:**
根节点kml,根节点解析器KmlParser:
SaxParser.start(getAssets().open("test.kml"), "kml", new Kml.KmlParser(kml));

**extends SaxParser**:
    public static class PlacemarkParser extends SaxParser {

    private Document document;
    private Placemark placemark;

    public PlacemarkParser(Document document) {
        super(new HashSet<String>(1));
        childParserQNames.add("Point");
        this.document = document;
    }

    @Override
    public void parserStart(Attributes attributes) {
        placemark = new Placemark();
    }

    @Override
    public void parserElementEnd(String qName, String value) {
        if(qName.equals("name")){
            placemark.name = value;

        }else if(qName.equals("when")){
            placemark.when = value;
        }
    }

    @Override
    public SaxParser dispatchTo(String qName, Attributes attributes) {
        if(qName.equals("Point")){
            return new Point.PointParser(placemark);
        }
        return null;
    }

    @Override
    public void parserEnd() {
        document.placemark = placemark;
    }
}

About

简化sax解析


Languages

Language:Java 100.0%