亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android開發之XML文件解析的使用

2020-04-11 12:27:32
字體:
來源:轉載
供稿:網友

  前言 

  本文主要介紹在Android中怎樣來解析XML文件。主要采用的是SAX機制,SAX全稱為Simple API for XML,它既是一種接口,也是一個軟件包。作為接口,SAX是事件驅動型XML解析的一個標準接口。XML文件解析一般有2種方法,DOM和SAX。其中DOM需要先將xml文檔全部讀入到電腦內存中,當文檔內容太大時,該方法并不適用。SAX就比較好的解決了該問題,它是逐行解析的,可以隨時中斷。但是SAX的操作比較復雜。因此,這2種方法各有優缺點,看具體應用情況。在前面的文章Qt學習之路_12(簡易數據管理系統)中使用的是Qt中的DOM方法。

  實驗說明

  大多數SAX實現都會產生類似下面的事件:

  在文檔的開始和結束處觸發文檔處理事件;在文檔內每一XML元素結束解析的前后觸發元素事件;任何元數據通常豆油單獨的事件交付;在處理文檔的DTD或者Schema時產生DTD 或者Schema事件;產生錯誤事件用來通知主機應用程序解析錯誤。

  SAX模型示意圖如下所示:

   

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

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

void startDocument();//文檔解析開始時執行

void endDocument();//文檔解析結束時執行

void startElement(String uri, String localName, String qName, Attributes atts);//標簽開始解析時執行

void endElement(String uri, String localName, String qName, Attributes atts);//標簽解析結束時執行

void characters(char[] ch, int start, int length );//解析標簽屬性時執行

  android中使用SAX來解析xml文件,需先建立一個SAX工廠,即SAXParserFactory對象,還需建立一個XMLReader對象,該類綁定ContentHandler子類,且與xml源文件結合在一起。即其處理過程為創建事件處理程序,創建SAX解析器,鍵事件處理程序分配給解析器,對文檔進行解析,將每個事件發送給處理程序。 

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

  本實驗是解析一段xml代碼,然后在上面每個解析函數中打印一些內容。主要是學會怎么使用SAX模型來來創建解析器,怎樣使用ContentHandler子類的函數來進行解析。

  實驗主要部分代碼:

Mainactivity.java:

復制代碼 代碼如下:

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點,第1:字符串中如果要換行寫,則應該用引號和加號來相加得到,不能直接換行寫
            //第2點:如果字符串中有字符,則用括號里面的符合(/")代替引號。
            //我這里用的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{
                //創建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:
復制代碼 代碼如下:

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;

    //當解析到標簽的屬性欄時調用該方法
    @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);
    }

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

    //解析標簽結束時調用
    @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);
    }

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

    //標簽開始時執行
    @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個屬性的名字和值
                System.out.println(attributes.getLocalName(i) + "=" + attributes.getValue(i));
            }

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

    //輸出標簽屬性解析結果
    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);
    }

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本成人在线视频网址| 国产经典一区二区| 中文字幕欧美在线| 色琪琪综合男人的天堂aⅴ视频| 亚洲黄色www网站| 久久成人国产精品| 欧美男插女视频| 97久久精品视频| 欧美激情视频在线免费观看 欧美视频免费一| 成人欧美在线观看| 日韩福利在线播放| 久久久久久久久久久人体| 日韩欧美在线视频免费观看| 亚洲国产毛片完整版| 第一福利永久视频精品| 亚洲国产精品嫩草影院久久| 欧美成人免费小视频| 亚洲成人网av| 91av视频在线播放| 97精品国产91久久久久久| 日韩有码在线视频| 日韩女优人人人人射在线视频| 超薄丝袜一区二区| 国产成人精品国内自产拍免费看| 亚洲精品www久久久久久广东| 亚洲精品成人久久久| 欧美精品在线视频观看| 精品久久久久久久大神国产| 理论片在线不卡免费观看| 97超级碰碰碰| 成人精品在线视频| 亚洲欧美国产精品久久久久久久| 亚洲女同性videos| 大桥未久av一区二区三区| 日韩美女在线播放| 欧美成人亚洲成人| 亚洲激情在线视频| 国产精品av免费在线观看| 在线播放日韩欧美| 亚洲欧美激情精品一区二区| 欧美在线xxx| 亚洲第一av网站| 美乳少妇欧美精品| 国产精品久久久久久久久久久久久久| 亚洲精品电影久久久| 中文精品99久久国产香蕉| 久久久国产成人精品| 久久亚洲一区二区三区四区五区高| 亚洲一区二区福利| 欧美老女人在线视频| 色偷偷偷亚洲综合网另类| www.日韩欧美| 久久99热这里只有精品国产| www.久久色.com| 91av在线国产| 亚州av一区二区| 亚洲国产欧美一区二区丝袜黑人| 庆余年2免费日韩剧观看大牛| 国产亚洲视频在线| 欧美综合一区第一页| 亚洲国产精品电影在线观看| 欧美成人午夜影院| 欧美—级高清免费播放| 中文字幕精品www乱入免费视频| 国产精品激情av在线播放| 国产丝袜一区二区| 亚洲va国产va天堂va久久| 久热精品视频在线观看一区| 成人a免费视频| 亚洲欧洲美洲在线综合| 国产精品久久电影观看| 色综合久久88色综合天天看泰| 国产成人精品av| 乱亲女秽乱长久久久| 久久久久久久久久久91| 在线丨暗呦小u女国产精品| 91国产中文字幕| 在线色欧美三级视频| 久久久视频免费观看| 国产精品自拍网| 中文字幕精品—区二区| 亚洲成人性视频| 国产精品日韩在线播放| 欧美亚洲在线视频| 中文字幕欧美日韩在线| 538国产精品视频一区二区| 亚洲国产欧美一区二区三区久久| 91牛牛免费视频| 久久九九国产精品怡红院| 欧美大片在线影院| 国a精品视频大全| 亚洲欧美国产va在线影院| 欧美在线视频免费观看| 91黑丝高跟在线| 国产精品永久在线| 亚洲一级免费视频| 日韩欧美国产免费播放| 国产在线精品一区免费香蕉| 在线亚洲欧美视频| 98精品国产高清在线xxxx天堂| 国产精品精品一区二区三区午夜版| 精品国产自在精品国产浪潮| 久久久久久亚洲精品不卡| 97在线日本国产| 久久久久国产精品免费网站| 中文字幕日韩av综合精品| 国产一区二区三区视频免费| 午夜美女久久久久爽久久| 国产精品99蜜臀久久不卡二区| 中文字幕在线看视频国产欧美| 久久亚洲精品国产亚洲老地址| 亚洲天堂日韩电影| 爱福利视频一区| 成人国产精品av| 久久91超碰青草是什么| 一区二区三区回区在观看免费视频| 久久香蕉精品香蕉| 中文字幕av一区中文字幕天堂| 欧美中文字幕精品| 亚洲在线视频观看| 国产精品高潮呻吟视频| 欧美激情在线一区| 国产精品视频久久久| 亚洲精品成人av| 97精品欧美一区二区三区| 欧美一区二区三区免费观看| 日韩小视频在线| 国内成人精品一区| 亚洲第一av网站| 国产v综合ⅴ日韩v欧美大片| 精品久久久久久久中文字幕| 2019中文字幕在线免费观看| 国产精品天天狠天天看| 超碰97人人做人人爱少妇| 丝袜亚洲欧美日韩综合| 91牛牛免费视频| 美日韩在线视频| 久久电影一区二区| 国产精品永久免费在线| 久久久久久久久久久久av| 91中文在线视频| 精品国产一区二区在线| 日韩va亚洲va欧洲va国产| 国语自产精品视频在线看抢先版图片| 日韩电影免费观看在线观看| 久久影视电视剧免费网站| 亚洲精品美女视频| 亚洲视频在线观看视频| 欧美激情免费视频| 在线日韩欧美视频| 亚洲国产精品嫩草影院久久| 亚洲女同性videos| 国产精品视频白浆免费视频| 国产精品自产拍在线观| 亚洲国产三级网| 久热精品视频在线观看一区| 欧美一性一乱一交一视频| 亚洲精品suv精品一区二区| 日本一本a高清免费不卡| 美女视频久久黄| 欧美国产日韩精品| 亚洲人永久免费| 国产亚洲精品美女久久久久| 92看片淫黄大片欧美看国产片|