編輯:Android開發實例
前言
本文主要介紹在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);
}
}
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
繼上一篇時間和日期設置的示例之後,今天來介紹Android的布局組件中有關於時間和日期的設置的組件,希望對大家有所幫助。具體如下: 時間日期設置組件:TimePi