編輯: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項目開發起到參考借鑒作用。
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
1. 布局XML/HTML代碼 <?xml version=&q
繼前一篇文章講到Android上的SQLite分頁讀取,其功能只是用文本框顯示數據而已。本文就講得更加深入些,實現並封裝一個SQL分頁表格控件,不僅支持分頁還是以