国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android開(kāi)發(fā)之XML文件解析的使用

2020-04-11 12:27:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  前言 

  本文主要介紹在Android中怎樣來(lái)解析XML文件。主要采用的是SAX機(jī)制,SAX全稱為Simple API for XML,它既是一種接口,也是一個(gè)軟件包。作為接口,SAX是事件驅(qū)動(dòng)型XML解析的一個(gè)標(biāo)準(zhǔn)接口。XML文件解析一般有2種方法,DOM和SAX。其中DOM需要先將xml文檔全部讀入到電腦內(nèi)存中,當(dāng)文檔內(nèi)容太大時(shí),該方法并不適用。SAX就比較好的解決了該問(wèn)題,它是逐行解析的,可以隨時(shí)中斷。但是SAX的操作比較復(fù)雜。因此,這2種方法各有優(yōu)缺點(diǎn),看具體應(yīng)用情況。在前面的文章Qt學(xué)習(xí)之路_12(簡(jiǎn)易數(shù)據(jù)管理系統(tǒng))中使用的是Qt中的DOM方法。

  實(shí)驗(yàn)說(shuō)明

  大多數(shù)SAX實(shí)現(xiàn)都會(huì)產(chǎn)生類似下面的事件:

  在文檔的開(kāi)始和結(jié)束處觸發(fā)文檔處理事件;在文檔內(nèi)每一XML元素結(jié)束解析的前后觸發(fā)元素事件;任何元數(shù)據(jù)通常豆油單獨(dú)的事件交付;在處理文檔的DTD或者Schema時(shí)產(chǎn)生DTD 或者Schema事件;產(chǎn)生錯(cuò)誤事件用來(lái)通知主機(jī)應(yīng)用程序解析錯(cuò)誤。

  SAX模型示意圖如下所示:

   

  如果要用SAX來(lái)解析xml文檔,則需要一個(gè)類來(lái)繼承android系統(tǒng)提供的ContentHandler類。但是如果繼承ContentHandler這個(gè)類, 即使你不使用這個(gè)類提供的所有方法,你也必須實(shí)現(xiàn)其內(nèi)部的所有方法(一般情況下沒(méi)有使用的方法可以直接用空方法代替),但是這樣開(kāi)發(fā)起來(lái)不是很方便。因此我們可以改為繼承DefaultHandler這個(gè)類,這樣的話我們只需要實(shí)現(xiàn)程序中所需要的方法即可,其它的方法這個(gè)類內(nèi)部其實(shí)已經(jīng)用空方法代替了。

ContentHandler接口的方法有以下幾種:

void startDocument();//文檔解析開(kāi)始時(shí)執(zhí)行

void endDocument();//文檔解析結(jié)束時(shí)執(zhí)行

void startElement(String uri, String localName, String qName, Attributes atts);//標(biāo)簽開(kāi)始解析時(shí)執(zhí)行

void endElement(String uri, String localName, String qName, Attributes atts);//標(biāo)簽解析結(jié)束時(shí)執(zhí)行

void characters(char[] ch, int start, int length );//解析標(biāo)簽屬性時(shí)執(zhí)行

  android中使用SAX來(lái)解析xml文件,需先建立一個(gè)SAX工廠,即SAXParserFactory對(duì)象,還需建立一個(gè)XMLReader對(duì)象,該類綁定ContentHandler子類,且與xml源文件結(jié)合在一起。即其處理過(guò)程為創(chuàng)建事件處理程序,創(chuàng)建SAX解析器,鍵事件處理程序分配給解析器,對(duì)文檔進(jìn)行解析,將每個(gè)事件發(fā)送給處理程序。 

  判斷String類型的值是否相等采用的是String類的equal方法。 

  本實(shí)驗(yàn)是解析一段xml代碼,然后在上面每個(gè)解析函數(shù)中打印一些內(nèi)容。主要是學(xué)會(huì)怎么使用SAX模型來(lái)來(lái)創(chuàng)建解析器,怎樣使用ContentHandler子類的函數(shù)來(lái)進(jìn)行解析。

  實(shí)驗(yàn)主要部分代碼:

Mainactivity.java:

復(fù)制代碼 代碼如下:

package com.example.xml;

import java.io.StringReader;

import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private Button start  = null;
    private TextView display = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start = (Button)findViewById(R.id.start);
        start.setOnClickListener(new StartOnClickListener());
    }

    public class StartOnClickListener implements OnClickListener{

        public void onClick(View v) {
            // TODO Auto-generated method stub
            //注意2點(diǎn),第1:字符串中如果要換行寫(xiě),則應(yīng)該用引號(hào)和加號(hào)來(lái)相加得到,不能直接換行寫(xiě)
            //第2點(diǎn):如果字符串中有字符,則用括號(hào)里面的符合(/")代替引號(hào)。
            //我這里用的xml文件直接為該程序layout的布局xml文件
//            String result_str =
//            "<RelativeLayout " +
//              "  xmlns:tools=/"http://schemas.android.com/tools/" " +
//              "  android:layout_width=/"match_parent/" " +
//              "  android:layout_height=/"match_parent/" > " +
//           
//             "   <Button  " +
//               "     android:id=/"@+id/start/"    " +
//                 "   android:layout_width=/"fill_parent/"    " +
//                  "  android:layout_height=/"wrap_content/"    " +
//                 "   android:layout_alignParentBottom=/"true/"    " +
//                  "  android:text=/"Start XML Parse/"    "    +
//                "    /> " +
//              "  <TextView " +
//                "    android:id=/"@+id/display/" " +
//               "     android:layout_width=/"fill_parent/"    " +
//                "    android:layout_height=/"fill_parent/"    " +
//                "    android:gravity=/"center/"    " +
//                "     android:layout_alignParentLeft=/"true/"    "    +
//                "     android:layout_above=/"@+id/start/"    "    +
//                "     android:text=/"The XML Parse Example!!/"    " +
//                "    />    " +
//        "    </RelativeLayout>";

            String result_str =        
             "   <Button  " +
               "     id=/"@+id/start/"    " +
                 "   layoutwidth=/"fillparent/"    " +
                  "  layoutheight=/"wrapcontent/"    " +
                 "   layoutalignParentBottom=/"true/"    " +
                  "  text=/"Start XML Parse/"    "    +
                "    </Button> " ;

           
            System.out.println(result_str);
            try{
                //創(chuàng)建SAX工廠
                SAXParserFactory factory = SAXParserFactory.newInstance();
                XMLReader reader = factory.newSAXParser().getXMLReader();
                reader.setContentHandler(new MyContentHandler());
                reader.parse(new InputSource(new StringReader(result_str)));
            }
            catch(Exception e) {
                e.printStackTrace();
            }

        }

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}


MyContentHandler.java:
復(fù)制代碼 代碼如下:

package com.example.xml;

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

public class MyContentHandler extends DefaultHandler {

    String tagname, sid, swidth, sheight, text, salign;

    //當(dāng)解析到標(biāo)簽的屬性欄時(shí)調(diào)用該方法
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if(tagname.equals("id"))
            sid = new String(ch, start, length);
        else if(tagname.equals("layoutwidth"))
            swidth = new String(ch, start, length);
        else if(tagname.equals("layoutheight"))
            sheight = new String(ch, start, length);
        else if(tagname.equals("layoutalignParentBottom"))
            salign = new String(ch, start, length);
        else if(tagname.equals("text"))
            text = new String(ch, start, length);
        super.characters(ch, start, length);
    }

    //解析文檔結(jié)束調(diào)用
    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("........end.......");
        super.endDocument();
    }

    //解析標(biāo)簽結(jié)束時(shí)調(diào)用
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        if(tagname.equals("Button")) {
            this.printout();
        }
        super.endElement(uri, localName, qName);
    }

    //解析文檔開(kāi)始時(shí)調(diào)用
    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        System.out.println("........begin.......");
        super.startDocument();
    }

    //標(biāo)簽開(kāi)始時(shí)執(zhí)行
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        tagname = localName;
        if(tagname.equals("Button")) {
            for(int i = 0; i < attributes.getLength(); i++) {       
                //得到第i個(gè)屬性的名字和值
                System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i));
            }

        }
        super.startElement(uri, localName, qName, attributes);
    }

    //輸出標(biāo)簽屬性解析結(jié)果
    private void printout() {
        System.out.print("id: ");
        System.out.println(sid);
        System.out.print("layout_width: ");
        System.out.println(swidth);
        System.out.print("layout_height: ");
        System.out.println(sheight);
        System.out.print("layout_alignParentBottom: ");
        System.out.println(salign);
        System.out.print("text: ");
        System.out.println(text);
    }

}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 英吉沙县| 佛山市| 尉犁县| 康保县| 时尚| 科技| 昭苏县| 长岛县| 启东市| 洪雅县| 海原县| 甘肃省| 碌曲县| 金昌市| 惠州市| 福建省| 富民县| 青田县| 库伦旗| 易门县| 玉田县| 龙海市| 慈利县| 大兴区| 乐东| 且末县| 和平区| 北辰区| 古田县| 商丘市| 西盟| 洱源县| 龙游县| 健康| 兴城市| 准格尔旗| 商丘市| 大足县| 城固县| 岳普湖县| 洛隆县|