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的對(duì)象烫葬,再通過其獲得一個(gè)XMLReader對(duì)象。這時(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堂油,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碧绞,更是在濱河造成了極大的恐慌府框,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥邻,死亡現(xiàn)場(chǎng)離奇詭異迫靖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兴使,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門系宜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鲫惶,你說我怎么就攤上這事蜈首。” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵欢策,是天一觀的道長(zhǎng)吆寨。 經(jīng)常有香客問我,道長(zhǎng)踩寇,這世上最難降的妖魔是什么啄清? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮俺孙,結(jié)果婚禮上辣卒,老公的妹妹穿的比我還像新娘。我一直安慰自己睛榄,他們只是感情好荣茫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著场靴,像睡著了一般啡莉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旨剥,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天咧欣,我揣著相機(jī)與錄音,去河邊找鬼轨帜。 笑死魄咕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚌父。 我是一名探鬼主播哮兰,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼苟弛!你這毒婦竟也來了奠蹬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤嗡午,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后冀痕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荔睹,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年言蛇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僻他。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腊尚,死狀恐怖吨拗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤劝篷,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布哨鸭,位于F島的核電站,受9級(jí)特大地震影響娇妓,放射性物質(zhì)發(fā)生泄漏像鸡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一哈恰、第九天 我趴在偏房一處隱蔽的房頂上張望只估。 院中可真熱鬧,春花似錦着绷、人聲如沸蛔钙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吁脱。三九已至,卻和暖如春子漩,著一層夾襖步出監(jiān)牢的瞬間豫喧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工幢泼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留紧显,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓缕棵,卻偏偏與公主長(zhǎng)得像孵班,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子招驴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容