Android SAX方式解析xml文件

之前我們講過pull方式解析xml文件的方法了,今天我們將學(xué)習(xí)下如何通過sax方式解析xml文件。

我們需要定義一個(gè)自己的類讓其繼承DefaultHandler

 private class MyHandler extends DefaultHandler{
    private String nodeName=null;
    private StringBuilder id=null,name=null,grade=null;

    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        id=new StringBuilder();
        name=new StringBuilder();
        grade=new StringBuilder();
    }

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

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        nodeName=localName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        if (localName.equals("student")){
            String a=id.toString().trim();
            String b=name.toString().trim();
            String c=grade.toString().trim();
            Log.d("result",a+" -- "+b+" -- "+c);
            id.setLength(0);
            name.setLength(0);
            grade.setLength(0);
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        if(nodeName.equals("id")){
            id.append(ch,start,length);
        }else if(nodeName.equals("name")){
            name.append(ch,start,length);
        }else if(nodeName.equals("grade")){
            grade.append(ch,start,length);
        }
    }

MyHolder里的5個(gè)方法都是繼承字DefaultHandler的,通過方法名應(yīng)該就能猜出來其功能,當(dāng)文檔開始時(shí)調(diào)用startDocument方法,當(dāng)文檔結(jié)束時(shí)調(diào)用endDocument方法,當(dāng)開始一個(gè)標(biāo)簽時(shí)調(diào)用startElement方法,當(dāng)結(jié)束一個(gè)標(biāo)簽時(shí)調(diào)用endElement方法,獲取里面的內(nèi)容調(diào)用characters方法

定義了成員變量nodeName用來存放當(dāng)前的節(jié)點(diǎn)名字,id,name,grade則分別存放student的id,name,garde

當(dāng)開始一個(gè)標(biāo)簽時(shí)給nodeName賦值,當(dāng)執(zhí)行到characters方法時(shí),根據(jù)nodeName里的值判斷需要執(zhí)行的操作。當(dāng)結(jié)束一個(gè)標(biāo)簽時(shí),打印出id,name,grade里面的值,同時(shí)將id,name,grade清空。這樣MyHandler就完成了。

接下來我們要實(shí)現(xiàn)調(diào)用的代碼了:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sax);
    Log.d("result","id -- name -- grade");
    new Thread(new Runnable() {
        @Override
        public void run() {
            f1();
        }
    }).start();
}

private void f1() {
    try {OkHttpClient client=new OkHttpClient();
        Request request=new Request.Builder().url("http://*.*.*.*:*/testPull.xml").build();
        Response response=client.newCall(request).execute();
        String s=response.body().string();
        f2(s);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void f2(String s) {

    try {
        SAXParserFactory factor=SAXParserFactory.newInstance();
        XMLReader reader=factor.newSAXParser().getXMLReader();
        MyHandler handler=new MyHandler();
        reader.setContentHandler(handler);
        reader.parse(new InputSource(new StringReader(s)));
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

f1()方法與pull解析的內(nèi)容相容,就不多說了。

先得到一個(gè)SAXParserFactor的對象,再通過其獲得一個(gè)XMLReader對象。這時(shí)我們就需要用到MyHandler了。
先new出MyHandler,再童工reader。setContentHandler()方法將handler加入進(jìn)去,再將獲取到的xml里的內(nèi)容加入進(jìn)去并讓其執(zhí)行,這樣,我們的MyHandler就可以運(yùn)行,運(yùn)行程序,打印一下結(jié)果:

image.png

我們的程序就完成了,趕快去試試把!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容