Android开发小知识-XML文件解析之SAX(Simple API for XML)

1、SAX解析XML文件是基于事件驱动的。
事件包括(以abc为例):
startDocument(开始解析文档)
startElement(开始解析元素) –>
characters(解析元素内容) –>abc
endElement(元素解析结束) –>
endDocument(文档解析结束)
2、SAX解析XML文件步奏。
a)创建事件处理程序。
b)创建SAX解析器。
c)将事件处理程序分配给解析器。
d)对文档进行解析。
3、举个例子看看。
a)定义一个类,继承DefaultHandler类(也可以实现ContentHandler接口,当然,哪一个方法比较方便,就不用说了吧),覆写其中的方法。这一步就是在实现事件处理程序。当解析文档产生事件时,会调用这个类的相应方法。代码如下(仅供参考):

package com.mindto.xml;

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

/**
 * Created by mindto on 2016/3/7.
 */
public class MyContentHandler extends DefaultHandler {
    //进行初始化操作,若不需要,完全可以不去覆写
    @Override
    public void startDocument() throws SAXException {
        System.out.println("MyContentHandler --> startDocument()");
    }
    //完成资源的释放,若不需要,完全可以不去覆写
    @Override
    public void endDocument() throws SAXException {
        System.out.println("MyContentHandler --> endDocument()");
    }

    /**
     * 解析到某一个元素时,调用该方法,如前面例子的 <doc>并不包括 abc</doc>
     * @param uri 当前解析节点的命名空间
     * @param localName 当前标签不带有前缀名称
     * @param qName 当前标签带有前缀名称
     * @param attributes 当前标签属性
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println("MyContentHandler --> startElement()");
        System.out.print("uri = " + uri + "  " + "localName = " + localName + "  " + "qName = " +  qName);
        for(int i = 0; i < attributes.getLength(); i ++){
            System.out.print(attributes.getValue(i));
        }
        System.out.println();
    }

    /**
     *解析到某一个元素的结束标签时,调用该方法,如前面例子的 </doc>
     * @param uri 当前解析节点的命名空间
     * @param localName 当前标签不带有前缀名称
     * @param qName 当前标签带有前缀名称
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println("MyContentHandler --> endElement()");
        super.endElement(uri, localName, qName);
    }

    /**
     * 解析到某个元素内容时,调用该方法,如前面例子的 abc
     * @param ch 存储该内容的char数组
     * @param start 起始下标
     * @param length 长度
     * @throws SAXException
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        System.out.println("MyContentHandler --> characters()");
        System.out.println(new String(ch,start, length));
    }
}

b)按照以下步骤创建解析器。

    //创建SAXParserFactory
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        //利用SAXParserFactory得到Reader
        XMLReader xmlReader = null;
        try {
             xmlReader = saxParserFactory.newSAXParser().getXMLReader();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        //设置内容处理器
        xmlReader.setContentHandler(new MyContentHandler());
        //开始解析文件,产生事件后,会调用MyContentHandler类对象的相应方法进行处理,我们要如何处理数据,均在MyContentHandler类的方法中完成
        try {
        //这里的MainActivity.this.xmlStr是一个XML文件读取出的字符串。我们完全可以用xmlReader.parse(new InputSource(new FileInputStream("xml文件路径")))进行代替解析本地文件。
            xmlReader.parse(new InputSource(new StringReader(MainActivity.this.xmlStr)));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }

该篇结束,若有不足,望不吝赐教!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值