Android學習筆記(16)————Android的XML解析之pull方式

來源:互聯網
上載者:User

/********************************************************************************************
 * author:conowen@大鐘                                                                                                                          
 * E-mail:conowen@hotmail.com                                                                                                             
 * http://blog.csdn.net/conowen                                                                                                              
 * 註:本文為原創,僅作為學習交流使用,轉載請標明作者及出處。     

 ********************************************************************************************/

1、XML文檔簡單解說:

首先先看一個XML文檔的截取部分:

<wordbook><item>    <word>cupboard</word>    <trans><![CDATA[n. 食櫥;碗櫃]]></trans>    <phonetic><![CDATA[['kʌbəd]]]></phonetic>    <tags>CET4-EASY</tags></item><item>    <word>a</word>    <trans><![CDATA[art. 一;任一;每一  a : 朱 FORM A: 普惠證|普惠制產地證|惠制原產地證明書 many a: 許多的|一個又一個的|很多]]></trans>    <phonetic><![CDATA[[ei]]]></phonetic>    <tags>CET4-EASY</tags></item><item>    <word>abandon</word>    <trans><![CDATA[n. 狂熱;放任 vt. 遺棄;放棄 abandon: 放棄|確認期權失效|委付 Call abandon: 呼叫中途掛機 abandon  v: 放棄]]></trans>    <phonetic><![CDATA[[ə'bændən]]]></phonetic>    <tags>CET4-EASY</tags></item><item>    <word>ability</word>    <trans><![CDATA[n. 能力,能耐;才能 Ability: 力|能力|本領 encapsulating ability: 包被抑制性 limited ability: 有限能力]]></trans>    <phonetic><![CDATA[[ə'biliti]]]></phonetic>    <tags>CET4-EASY</tags></item>
</wordbook>

模型:

< 文檔標籤><子標籤><標籤A>str1<標籤A/><標籤B>str2<標籤B/><子標籤/><子標籤><標籤A>str1<標籤A/><標籤B>str2<標籤B/><子標籤/><子標籤><標籤A>str1<標籤A/><標籤B>str2<標籤B/><子標籤/><文檔標籤/>

      在上面的 XML 中,文檔標籤是 <wordbook>。文檔中的其他的所有子標籤都被包含在文檔<bookstore> 中。文檔標籤 <wordbook> 有四個 <item>子標籤。每一個 <item>子標籤有四個節點:<word>,
<trans>, <phonetic> 以及<tags>節點,其中每個節點都包含這個節點的內容。

注意:標籤裡面的str內容,如果是換行的,解析xml檔案之後,列印出來的也是換行的

XML檔案:http://ishare.iask.sina.com.cn/f/20283647.html

2、Android平台的XML解析方案:

                在Android平台上可以使用以下三種XML解析方式:

2.1、Simple API for XML(SAX)

          SAX解析方式是基於事件驅動的。當讀到文檔標籤的開始或者結束時,會有相應的事件,當讀到一個子節點的開始標籤或者結束標籤時也會有相應的事件。當讀到某一個子節點的其中一個節點時也會有相應的事件。由於Android平台的事件驅動是基於回呼函數的,也就是說遇到上述事件時,會實現一個回呼函數的介面。

2.2、Document Object Model(DOM)

          DOM解析XML時,會把整個XML文檔視作一個節點樹,直接把整個節點樹讀取到記憶體裡面,再進行解析,這樣一來優點就是操作簡單方便,但是缺點就是對於大體積的XML文檔,解析起來機會很慢,而且很耗費資源。

2.3、Android附帶的pull解析器

  Pull方基本與SAX一樣

簡而言之,對於大體積的XML檔案,最好選用SAX或者Pull方式解析,對於小體積的XML文檔,可以選擇DOM解析。

3、Pull解析方式詳解

註:以下所說的標籤包括子標籤和子標籤裡面的所有標籤

Pull解析的相關方法:

XmlResourceParser xrp;//定義一個XML資源解析器

XmlResourceParser.START_DOCUMENT 遇到文檔標籤的開始

XmlResourceParser.END_DOCUMENT 遇到文檔標籤的結束

XmlPullParser.START_TAG: 遇到標籤的開始

XmlPullParser.END_TAG:遇到標籤的結束xrp.getName()擷取標籤的名稱xrp.nextText();擷取標籤裡面的內容(str)(不是xrp.gettext();)xrp.next();繼續讀取下一個標籤

xrp.nextTag();繼續讀取下一個標籤,和next()基本 一樣

下面寫一個解析"英語詞典.XML",來實現一個android 字典程式。詳細解說可以看注釋。

/*author:conowen * date:2012.4.1 */package com.conowen.Dictionary;import android.app.Activity;import android.content.res.XmlResourceParser;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class DictionaryActivity extends Activity {String input = null;String match = null;EditText et = null;Button search = null;Button del = null;TextView display = null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);et = (EditText) findViewById(R.id.et);search = (Button) findViewById(R.id.search);del = (Button) findViewById(R.id.del);display = (TextView) findViewById(R.id.tv);search.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubinput = et.getText().toString();// 現在工程的res目錄下面建立一個xml檔案夾,把cet4.xml拖進去XmlResourceParser xrp = getResources().getXml(R.xml.cet4);// 定義一個XML資源解析器try {StringBuilder strbuilder = new StringBuilder("");while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {// 當還沒到XML文檔結束時if (xrp.getEventType() == XmlResourceParser.START_TAG) {// 當遇到開始標籤時,包括子標籤和子標籤裡面的所有標籤String tagname = xrp.getName();// 擷取標籤的名字if (tagname.equals("word")) {// 取出單詞match = xrp.nextText();// 讀取標籤裡面內容,也就是這個單詞if (match.equals(input)) {// 如果取出來的這個單詞和輸入的單詞相等xrp.next();// 讀取這個下一個標籤,也就是<trans>翻譯strbuilder.append(xrp.nextText());// 取出翻譯display.setText(strbuilder);// 顯示翻譯                                                                        break;}}}xrp.next();// 讀取下一個標籤}} catch (Exception e) {// TODO: handle exception}}});del.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubdisplay.setText("");et.setText("");}});}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.