Android開(kāi)發(fā)之XML文件解析的使用
前言
本文主要介紹在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:
import java.io.StringReader; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import android.app.Activity; public class MainActivity extends Activity { private Button start = null; public class StartOnClickListener implements OnClickListener{ public void onClick(View v) { import org.xml.sax.Attributes; public class MyContentHandler extends DefaultHandler { String tagname, sid, swidth, sheight, text, salign; //解析文檔結(jié)束調(diào)用 //解析標(biāo)簽結(jié)束時(shí)調(diào)用 //解析文檔開(kāi)始時(shí)調(diào)用 //標(biāo)簽開(kāi)始時(shí)執(zhí)行
package com.example.xml;
import org.xml.sax.XMLReader;
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;
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());
}
// TODO Auto-generated method stub
//注意2點(diǎn),第1:字符串中如果要換行寫,則應(yīng)該用引號(hào)和加號(hào)來(lái)相加得到,不能直接換行寫
//第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:
package com.example.xml;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
//當(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);
}
@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個(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);
}
}
- Android中使用sax解析xml文件的方法
- Android 解析XML 文件的四種方法總結(jié)
- Android中使用PULL方式解析XML文件深入介紹
- Android 使用Pull方法解析XML文件的方法
- android編程之XML文件解析方法詳解(附源碼)
- Android中使用pull解析器操作xml文件的解決辦法
- Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼
- android開(kāi)發(fā)基礎(chǔ)教程—三種方式實(shí)現(xiàn)xml文件解析
- Android開(kāi)發(fā)之DOM解析xml文件的方法
- Android中對(duì)xml文件解析的3種方式總結(jié)
相關(guān)文章
Dagger2 Android依賴注入學(xué)習(xí)筆記
這篇文章主要介紹了Dagger2 Android依賴注入學(xué)習(xí)筆記,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Flutter?Flow實(shí)現(xiàn)滑動(dòng)顯隱層示例詳解
這篇文章主要為大家介紹了Flutter?Flow實(shí)現(xiàn)滑動(dòng)顯隱層示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Android View的事件分發(fā)機(jī)制深入分析講解
事件分發(fā)從手指觸摸屏幕開(kāi)始,即產(chǎn)生了觸摸信息,被底層系統(tǒng)捕獲后會(huì)傳遞給Android的輸入系統(tǒng)服務(wù)IMS,通過(guò)Binder把消息發(fā)送到activity,activity會(huì)通過(guò)phoneWindow、DecorView最終發(fā)送給ViewGroup。這里就直接分析ViewGroup的事件分發(fā)2023-01-01
android TabHost(選項(xiàng)卡)的使用方法
Android中的選項(xiàng)卡是用TabHost實(shí)現(xiàn)的,下面我們用一個(gè)例子說(shuō)明他的使用方法2013-11-11
Android中使用Camera類編寫手機(jī)拍照App的實(shí)例教程
這篇文章主要介紹了Android中使用Camera類編寫手機(jī)拍照App的實(shí)例教程,整理了Camera調(diào)用硬件進(jìn)行拍照的一些常用方法,需要的朋友可以參考下2016-04-04
Android仿網(wǎng)易新聞圖片詳情下滑隱藏效果示例代碼
這篇文章主要給大家介紹了關(guān)于利用Android如何仿網(wǎng)易新聞圖片詳情下滑隱藏效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07
Android實(shí)現(xiàn)的狀態(tài)欄定制和修改方法
這篇文章主要介紹了Android實(shí)現(xiàn)的狀態(tài)欄定制和修改方法,涉及Android針對(duì)狀態(tài)欄屬性設(shè)置的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android retrofit上傳文件實(shí)例(包含頭像)
下面小編就為大家分享一篇Android retrofit上傳文件實(shí)例(包含頭像),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01

