android之XML解析

所谓SAX,就是SAX simple API for XML,是一个解析XML文件的简单API。

SAX解析XML的工作原理,是对文档进行顺序扫描,当扫描到文档开始与结束,元素开始与结束,触发相应的响应函数。是一种事件驱动型的解析方式。它可以在解析文档的任意时刻停止解析。

技术分享

通过该图我们可以大概了解解析的过程。

private void parse(String xmlString,List<Mp3Info> infos){
    // SAXParserFactory 是一个使用工厂模式的类
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    try {
        XMLReader reader = saxParserFactory.newSAXParser().getXMLReader();
        reader.setContentHandler(new Mp3ListContentHandler(infos));
        reader.parse(new InputSource(new StringReader(xmlString)));

    }catch (Exception e) {
        e.printStackTrace();
    }

}

使用SAX解析XML文件,首先要得到一个SAXParserFactory对象,然后得到一个XMLreader对象,再将自己实现的Contenthandler接口的类对象传递给XMLreader的setContenthandler方法,最后调用XMLreader的parse方法,将需要解析的XML文件生成Inputsource放入即可。

解析XML文件的关键在于自己实现Contenthandler这一接口的类,在这个类中,可以按照我们的需求来解析XML文件,将不同标签下的内容按照自己的需要使用、存储。

/**
 * XML解析类,通过继承DefualtHandler,并复写该类中的方法解析XML文件
 * 这里采用的是SAX解析方式,同时没有选择实现接口,而是通过adapt模式,继承一个实现了ContentHandler接口的类
 * @author 龙凯
 *
 */
public class Mp3ListContentHandler extends DefaultHandler {
    private List<Mp3Info> infos = null;
    private Mp3Info mp3Info = null;
    private String tagname = null;


    public Mp3ListContentHandler(List<Mp3Info> infos) {
        super();
        this.infos = infos;
    }
    /*
     * (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
     * 处理文件内容
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        String info = new String (ch,start,length);
        if (tagname.equals("id")) {
            mp3Info.setId(info);
        }
        else if(tagname.equals("mp3.name")) {
            mp3Info.setMp3name(info);
        }
        else if (tagname.equals("mp3.size")) {
            mp3Info.setMa3size(info);
        }
        else if (tagname.equals("lrc.name")) {
            mp3Info.setLrcname(info);
        }
        else if (tagname.equals("lrc.size")) {
            mp3Info.setLrcsize(info);
        }
    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //如果结束标签名为设定标签名,实现特定的方法
        if (localName.equals("resource")) {
            infos.add(mp3Info);
        }
        tagname = "";
    }

    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // 每次新解析到一个标签时,识别标签名,根据不同的标签名,调用不同的方法
        this.tagname = localName;
        if (tagname.equals("resource")) {
            mp3Info = new Mp3Info();
        }
    }
}

通过这个类,主要实现的是解析一个Mp3resource.XML文件,通过该文件读出mp3文件的名字,大小,id,以及歌词lrc文件的名字大小,存储在一个list的list中。下面是XML文件:

<?xml version="1.0" encoding="ISO-8859-1"?>

<resources>
    <resource>
        <id>0001</id>
        <mp3.name>a1.mp3</mp3.name>
        <mp3.size>10033011</mp3.size>
        <lrc.name>a1.lrc</lrc.name>
        <lrc.size>9053</lrc.size>
    </resource>

    <resource>
        <id>0002</id>
        <mp3.name>a2.mp3</mp3.name>
        <mp3.size>10033011</mp3.size>
        <lrc.name>a2.lrc</lrc.name>
        <lrc.size>9053</lrc.size>
    </resource>

</resources>

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。