編輯:Android開發實例
本文使用SAX來解析XML,在Android裡面可以使用SAX和DOM,DOM需要把整個XML文件讀入內存再解析,比較消耗內存,而SAX基於事件驅動的處理方式,可以在各節點觸發回調函數,不過SAX適合節點結構簡單的XML文檔,復雜的XML文檔在後期的節點深度處理會有點麻煩。
本文要解析的test.xml文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <test>
- <title>testSAX</title>
- <content aa="1" bb="2">
- <name>hellogv</name>
- <url>http://blog.csdn.net/hellogv</url>
- </content>
- </test>
解析如上XML的結果如下:
使用SAX解析,需要定義SAXParserFactory(使應用程序能夠配置和獲取基於 SAX 的解析器以解析 XML 文檔),SAXParser(從各種輸入源解析 XML),XMLReader(使用回調函數讀取 XML 文檔),其中XMLReader是個關鍵。XMLReader可以為解析XML定義各種回調函數,“條件符合”的時候觸發這些回調函數。
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
- XMLReader reader = parser.getXMLReader();
- reader.setContentHandler(handler);
- reader.parse(new InputSource(testSAX.this.getResources()
- .openRawResource(R.raw.test)));
在這段代碼裡,XMLReader就調用繼承DefaultHandler的SAXHandler。DefaultHandler已實現ContentHandler, DTDHandler, EntityResolver, ErrorHandler等接口,包含常見讀取XML的操作,具體請看下面的SAXHandler.java源碼。
生成XML的結果如下:
上圖是讀取各節點之後,使用XmlSerializer重新組合並輸出XML字符串。
本文的main.xml代碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <Button android:layout_height="wrap_content"
- android:layout_width="fill_parent" android:id="@+id/btnSAX"
- android:text="使用SAX解析XML"></Button>
- <Button android:layout_height="wrap_content"
- android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput"></Button>
- <EditText android:text="@+id/EditText01" android:id="@+id/EditText01"
- android:layout_width="fill_parent" android:layout_height="fill_parent"></EditText>
- </LinearLayout>
SAXHandler.java的源碼如下:
- package com.testSAX;
- import java.util.ArrayList;
- import org.xml.sax.Attributes;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- import android.util.Log;
- public class SAXHandler extends DefaultHandler{
- private ArrayList<String> keys = new ArrayList<String>();//保存字段名稱
- private ArrayList<Object> values = new ArrayList<Object>();//保存值
- @Override
- public void startDocument() throws SAXException {
- super.startDocument();
- }
- @Override
- public void endDocument() throws SAXException {
- super.endDocument();
- }
- @Override
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- //保存開始標記
- keys.add("startTag");
- values.add(localName);
- Log.e("startTag",localName);
- //保存屬性值
- for ( int i = 0; i < attributes.getLength(); i++ ){
- keys.add("Attr");
- String[] str=new String[2];
- str[0]=attributes.getLocalName(i);
- str[1]=attributes.getValue(i);
- values.add(str);
- Log.e("Attr",str[0]+"="+str[1]);
- }
- }
- @Override
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- //保存結束標記
- keys.add("endTag");
- values.add(localName);
- Log.e("endTag",localName);
- }
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- String value = new String(ch, start, length);
- value = value.trim();
- if (value.length() == 0)
- return;
- keys.add("text");
- values.add(value);
- Log.e("text",value);
- }
- public ArrayList<String> GetKeys()
- {
- return keys;
- }
- public ArrayList<Object> GetValues()
- {
- return values;
- }
- }
testSAX.java的源碼如下:
- package com.testSAX;
- import java.io.StringWriter;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.InputSource;
- import org.xml.sax.XMLReader;
- import org.xmlpull.v1.XmlSerializer;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Xml;
- import android.view.View;
- import android.widget.Button;
- import android.widget.EditText;
- public class testSAX extends Activity {
- /** Called when the activity is first created. */
- Button btnSAX, btnOutput;
- EditText memo;
- SAXHandler handler = new SAXHandler();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btnSAX = (Button) this.findViewById(R.id.btnSAX);
- btnSAX.setOnClickListener(new ClickEvent());
- btnOutput = (Button) this.findViewById(R.id.btnOutput);
- btnOutput.setOnClickListener(new ClickEvent());
- memo = (EditText) this.findViewById(R.id.EditText01);
- }
- class ClickEvent implements View.OnClickListener {
- @Override
- public void onClick(View v) {
- if (v == btnSAX) {//解析XML,並保存標記,屬性等值
- try {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
- XMLReader reader = parser.getXMLReader();
- reader.setContentHandler(handler);
- reader.parse(new InputSource(testSAX.this.getResources()
- .openRawResource(R.raw.test)));
- } catch (Exception ee) {}
- }
- else if (v == btnOutput) {//生成XML
- try {
- XmlSerializer serializer = Xml.newSerializer();
- StringWriter writer = new StringWriter();
- try {
- serializer.setOutput(writer);
- serializer.startDocument("UTF-8",true);
- for(int i=0;i<handler.GetKeys().size();i++)
- {
- if(handler.GetKeys().get(i).equals("startTag"))
- {
- serializer.startTag("", (String) handler.GetValues().get(i));
- }
- else if(handler.GetKeys().get(i).equals("Attr")){
- String[] str= (String[]) handler.GetValues().get(i);
- serializer.attribute("",str[0],str[1]);
- }
- else if(handler.GetKeys().get(i).equals("text"))
- serializer.text((String)handler.GetValues().get(i));
- else if(handler.GetKeys().get(i).equals("endTag"))
- {
- serializer.endTag("", (String) handler.GetValues().get(i));
- }
- }
- serializer.endDocument();
- String text=writer.toString();
- text=text.replace("><", ">\r\n<");
- memo.setText(text);//輸出到文本框
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- } catch (Exception e) {}
- }
- }
- }
- }
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
前一節中將了貪吃蛇Snake游戲的暫停/繼續、穿牆和全屏功能的實現,本文繼續分
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩