Android解析xml(1)---SAX解析

SAX是一种以事件为驱动的XML API,特点是 解析速度快、占用内存少,适用于Android等CPU、内存资源宝贵的移动设备。SAX被认为是处理XML最有效的标准方法。

record.xml

<?xml version="1.0" encoding="UTF-8"?>
<record>
    <study id="1">
        <topic>SAX Parser</topic>
        <content>parse XML using SAXParser</content>
        <author>Pete Houston</author>
        <date>02-Oct-2011</date>
    </study>
</record>

下面以日志形式打印出了SAX解析record.xml的整个过程:
这里写图片描述

创建一个名为SAXParser的项目

1.针对从XMl中需要获得的信息,新建一个Study类。

package com.example.data;

public class Study {
    public int mId;
    public String mTopic;
    public String mContent;
    public String mAuthor;
    public String mDate;

    public static final String STUDY = "study";
    public static final String ID = "id";
    public static final String TOPIC = "topic";
    public static final String CONTENT = "content";
    public static final String AUTHOR = "author";
    public static final String DATE = "date";
}

2.新建一个类继承自DefaultHandler,而DefaultHandler是实现了ContentHandler的接口。ContentHandler提供了解析xml所需要的各个方法。

public class StudyHandler extends DefaultHandler {

    private static final String TAG = "StudyHandler";
    // 成员变量
    private boolean isTopic;
    private boolean isContent;
    private boolean isAuthor;
    private boolean isDate;

    // 记录当前要解析的Study
    private Study mStudy;

    public Study getStudy() {
        return mStudy;
    }

    // 在此事件中进行初始化
    @Override
    public void startDocument() throws SAXException {
        Log.d(TAG,"***startDocument()***");
        mStudy = new Study();
    }

    @Override
    public void startElement(String namespaceURI, String localName, String qName, Attributes atts)
                            throws SAXException {

        Log.d(TAG,"***startElement()***");
        if(localName.equals(Study.STUDY)) {
            mStudy.mId = Integer.parseInt(atts.getValue(Study.ID));
            Log.d(TAG,"attributeName:"+atts.getLocalName(0)+" attributeValue:"+atts.getValue(0));
        }else if(localName.equals(Study.TOPIC)) {
            isTopic = true;
        }else if(localName.equals(Study.CONTENT)) {
            isContent = true;
        }else if(localName.equals(Study.AUTHOR)) {
            isAuthor = true;
        }else if(localName.equals(Study.DATE)) {
            isDate = true;
        }
    }

    @Override
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
        Log.d(TAG,"***endElement()***");
        if(localName.equals(Study.TOPIC)) {
            isTopic = false;
        }else if(localName.equals(Study.CONTENT)) {
            isContent = false;
        }else if(localName.equals(Study.AUTHOR)) {
            isAuthor = false;
        }else if(localName.equals(Study.DATE)) {
            isDate = false;
        }
    }

    @Override
    public void characters(char ch[], int start, int length) {
        String chars = new String(ch, start, length);
        chars = chars.trim(); // 避免读取到的XML有空格,造成格式混乱
        if(!"".equals(chars.trim())){
            Log.d(TAG, "content:"+chars);
        }
        if(isTopic) mStudy.mTopic = chars;
        else if(isContent) mStudy.mContent = chars;
        else if(isAuthor) mStudy.mAuthor = chars;
        else if(isDate) mStudy.mDate = chars;
    }

    @Override
    public void endDocument() throws SAXException {
        Log.d(TAG,"***endDocument()***");
    }
}

3.新建一个工具类处理所有的解析事务

public class StudyParser {
    public static Study parse(InputStream is) {
        Study study = null;
        try {
            // 从SAXParser中得到XMLReader
            XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
            StudyHandler studyHandler = new StudyHandler();
            xmlReader.setContentHandler(studyHandler);
            xmlReader.parse(new InputSource(is));
            study = studyHandler.getStudy();
        } catch(Exception ex) {
            Log.d("XML", "StudyParser: parse() failed");
        }
        return study;
    }
}

4.MainActivity.java

public class MainActivity extends Activity {

    private TextView tv_id;
    private TextView tv_topic;
    private TextView tv_content;
    private TextView tv_author;
    private TextView tv_date;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_id = (TextView)findViewById(R.id.tv_id);
        tv_topic = (TextView)findViewById(R.id.tv_topic);
        tv_content = (TextView)findViewById(R.id.tv_content);
        tv_author = (TextView)findViewById(R.id.tv_author);
        tv_date = (TextView)findViewById(R.id.tv_date);

        Study study = null;
        try {
            study = StudyParser.parse(getAssets().open("record.xml"));
            tv_id.setText(study.mId+"");
            tv_topic.setText(study.mTopic);
            tv_content.setText(study.mContent);
            tv_author.setText(study.mAuthor);
            tv_date.setText(study.mDate);
        } catch (IOException e) {
            Log.d("XML","onCreate(): parse() failed");
            return;
        }

    }
}

运行截图:
这里写图片描述

源码下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值