Android提高之XML解析與生成實(shí)例詳解
本文實(shí)例講述了使用SAX來解析XML。通常來說在Android里面可以使用SAX和DOM,DOM需要把整個(gè)XML文件讀入內(nèi)存再解析,比較消耗內(nèi)存,而SAX是基于事件驅(qū)動(dòng)的處理方式,可以在各節(jié)點(diǎn)觸發(fā)回調(diào)函數(shù),不過SAX適合節(jié)點(diǎn)結(jié)構(gòu)簡單的XML文檔,復(fù)雜的XML文檔在后期的節(jié)點(diǎn)深度處理會(huì)有點(diǎn)麻煩。
本文要解析的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的結(jié)果如下圖所示:
使用SAX解析,需要定義SAXParserFactory(使應(yīng)用程序能夠配置和獲取基于 SAX 的解析器以解析 XML 文檔),SAXParser(從各種輸入源解析 XML),XMLReader(使用回調(diào)函數(shù)讀取 XML 文檔),其中XMLReader是個(gè)關(guān)鍵。XMLReader可以為解析XML定義各種回調(diào)函數(shù),“條件符合”的時(shí)候觸發(fā)這些回調(diào)函數(shù)。
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就調(diào)用繼承DefaultHandler的SAXHandler。DefaultHandler已實(shí)現(xiàn)ContentHandler, DTDHandler, EntityResolver, ErrorHandler等接口,包含常見讀取XML的操作,具體請(qǐng)看下面的SAXHandler.java源碼。
最終生成XML的結(jié)果如下圖所示:
上圖是讀取各節(jié)點(diǎn)之后,使用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 { //保存開始標(biāo)記 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 { //保存結(jié)束標(biāo)記 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,并保存標(biāo)記,屬性等值 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) {} } } } }
感興趣的讀者可以自己動(dòng)手調(diào)試運(yùn)行一下本實(shí)例代碼,希望能對(duì)大家的Android項(xiàng)目開發(fā)起到參考借鑒作用。
- android通用xml解析方法
- 基于Android XML解析與保存的實(shí)現(xiàn)
- android layout XML解析錯(cuò)誤的解決方法
- Android中使用sax解析xml文件的方法
- Android 解析XML 文件的四種方法總結(jié)
- Android中使用PULL方式解析XML文件深入介紹
- Android 使用Pull方法解析XML文件的方法
- android編程之XML文件解析方法詳解(附源碼)
- Android使用Pull解析器解析xml文件的實(shí)現(xiàn)代碼
- 19個(gè)Android常用工具類匯總
- android 一些工具類匯總
- Android開發(fā)中解析xml文件XmlUtils工具類與用法示例
相關(guān)文章
Android Compose自定義TextField實(shí)現(xiàn)自定義的輸入框
眾所周知Compose中默認(rèn)的TextField和OutlineTextField樣式并不能滿足所有的使用場景,所以自定義TextField就成了必備技能。本文將自定義TextField實(shí)現(xiàn)自定義的輸入框,感興趣的可以了解一下2022-03-03android實(shí)現(xiàn)簡單進(jìn)度條ProgressBar效果
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)簡單進(jìn)度條ProgressBar效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Android GestureDetector手勢滑動(dòng)使用實(shí)例講解
這篇文章主要為大家詳細(xì)介紹了Android GestureDetector手勢滑動(dòng)使用實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07Android實(shí)現(xiàn)底部彈出PopupWindow背景逐漸變暗效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部彈出PopupWindow背景逐漸變暗效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Android 安全加密:數(shù)字簽名和數(shù)字證書詳解
本文主要介紹Android 安全加密數(shù)字簽名和數(shù)字證書的資料,這里整理詳細(xì)的資料及數(shù)字簽名和數(shù)字證書應(yīng)用詳解,有需要的小伙伴可以參考下2016-09-09Android編程調(diào)用系統(tǒng)自帶的拍照功能并返回JPG文件示例【附demo源碼下載】
這篇文章主要介紹了Android編程調(diào)用系統(tǒng)自帶的拍照功能并返回JPG文件,結(jié)合實(shí)例形式分析了Android的拍照功能調(diào)用及圖形文件操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-07-07