码迷,mamicode.com
首页 > 移动开发 > 详细

Android 之XML数据解析(2)—— SAX解析

时间:2017-03-20 16:51:08      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:文件   pull   tac   相关   清空   sax   set   target   png   

(以下文章基本照抄郭霖大神的《第一行代码》)

Android之 解析XML文件(1)—— Pull解析 中我们讲了Pull方式解析XML文件。今天讲另外一种方式,SAX解析XML文件。

首先还是先看代码。

一、 SAX解析参考代码

private void parseXMLWithSAX(String xmlData){
    try{
        SAXParserFactory factory = SAXParserFactory.newInstance();
        XMLReader xmlReader = factory.newSAXParser().getXMLReader();
        ContentHandler handler = new ContentHandler();
        //将ContentHandler的实例设置到XMLReader中
        xmlReader.setContentHandler(handler);
        //开始执行解析
        xmlReader.parse(new InputSource(new StringReader(xmlData)));
    }catch(Exception e){
        e.printStackTrace();
    }
}

这里我们看到SAX解析看起来要比Pull解析简洁明了很多。

 

二、 相关类简介

1、 SAXParserFactory 

 SAXParserFactory 与 XmlPullParserFactory类相似。也是提供SAXParser 实例的一个工厂。

下面是Android API中对 SAXParserFactory类的定义。

技术分享

下面是SAXParserFactory中定义的方法。代码中使用到的 newInstance() 与 newSAXParser() 分别用于产生一个SAXParserFactory实例和产生一个SAXParser实例。

技术分享

 

2、XMLReader

XMLReader是一个接口。通过它的setContentHandler()方法,可以设置解析事件的处理handler,通过parse()方法可以开始解析。

XMLReader的实例是通过SAXParser类的 getXMLReader()方法来获取的。

 

3、ContentHandler

上诉代码中ContentHandler类是我们自己写的类,继承自DefaultHandler类。DefaultHandler类是SAX2事件处理的默认基础类。

它提供了在四个核心的SAX处理类中的所有回调的默认实现。我们可以继承该类,在对应的方法中重写我们的处理逻辑。

下面是Android API中对DefaultHandler类的描述。

技术分享

我们继承的DefaultHandler类 具体代码如下:

public class ContentHandler extends DefaultHandler{
    
    private String nodeName;
    private StringBuilder id;
    private StringBuilder name;
    private StringBuilder version;
    
    //初始化
    @Override
    public void startDocument() throws SAXException{
        id = new StringBuilder();
        name = new StringBuilder();
        version = new StringBuilder();
    }
    
    @Override
    public void startElement(String uri,String localName,
        String qName,Attributes attributes) throws SAXException{
            //记录当前结点名
            nodeName = localName;
    }
        
    @Override
    public void characters(char[] ch,int start,
        int length) throws SAXException{
        //根据当前结点名判断将内容添加到哪一个StringBuilder对象中
        if("id".equals(nodeName)){
            id.append(ch,start,length);
        }else if("name".equals(nodeName)){
            name.append(ch,start,length);
        }else if("version".equals(nodeName)){
            version.append(ch,start,length);
        }
    }
    
    @Override
    public void endElement(String uri,String localName,
        String qName) throws SAXException{
        if("app".equals(localName){
            Log.d("ContentHandler","id is" + id.toString().trim());
            Log.d("ContentHandler","name is" + name.toString().trim());
            Log.d("ContentHandler","version is" + version.toString().trim());
            //最后还要讲StringBuilder清空
            id.setLength(0);
            name.setLength(0);
            version.setLength(0);
        }
    }
    
    @Override
    public void endDocument throws SAXException{    
    }
}

可以看到在ContentHandler这个处理类中对xml数据的处理方式与Pull解析是类似的。所以SAX解析只不过是将解析用到的方法封装起来,代码书写的时候逻辑更为清晰。

 

综上,使用SAX解析XML数据我们需要做以下几步:

1、使用SAXParserFactory 类中的newInstance()方法获取SAXParserFactory 类实例。

2、通过SAXParserFactory 类实例的newSAXParser()方法获取SAXParser实例

3、通过SAXParser实例的getXMLReader()获取XMLReader的实例

4、XMLReader实例调用setContentHandler(ContentHandler contentHandler)方法设置解析所需的处理事件

5、自定义一个类继承自 DefaultHandler,重写我们需要的方法(这些方法里面是我们用于处理XML数据的逻辑)。

6、最后调用XMLReader的parse()方法解析数据。

 

Android 之XML数据解析(2)—— SAX解析

标签:文件   pull   tac   相关   清空   sax   set   target   png   

原文地址:http://www.cnblogs.com/cuglkb/p/6589619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!