21天學(xué)習(xí)android開發(fā)教程之XML解析與生成
本文使用SAX來解析XML,在Android里面可以使用SAX和DOM,DOM需要把整個XML文件讀入內(nèi)存再解析,比較消耗內(nèi)存,而SAX基于事件驅(qū)動的處理方式,可以在各節(jié)點觸發(fā)回調(diào)函數(shù),不過SAX適合節(jié)點結(jié)構(gòu)簡單的XML文檔,復(fù)雜的XML文檔在后期的節(jié)點深度處理會有點麻煩。
本文要解析的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>
使用SAX解析,需要定義SAXParserFactory(使應(yīng)用程序能夠配置和獲取基于 SAX 的解析器以解析 XML 文檔),SAXParser(從各種輸入源解析 XML),XMLReader(使用回調(diào)函數(shù)讀取 XML 文檔),其中XMLReader是個關(guān)鍵。XMLReader可以為解析XML定義各種回調(diào)函數(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已實現(xiàn)ContentHandler, DTDHandler, EntityResolver, ErrorHandler等接口,包含常見讀取XML的操作,具體請看下面的SAXHandler.java源碼。
讀取各節(jié)點之后,使用XmlSerializer重新組合并輸出XML字符串。本文的main.xml代碼如下:
<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 android:layout_height="wrap_content"
android:layout_width="fill_parent" android:text="生成XML" android:id="@+id/btnOutput">
<edittext android:text="@+id/EditText01" android:id="@+id/EditText01"
android:layout_width="fill_parent" android:layout_height="fill_parent">
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) {}
}
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
Android編程學(xué)習(xí)之異步加載圖片的方法
這篇文章主要介紹了Android編程學(xué)習(xí)之異步加載圖片的方法,以實例形式較為詳細的分析了Android異步加載圖片所涉及的頁面布局及功能實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
android實現(xiàn)自動關(guān)機的具體方法
android實現(xiàn)自動關(guān)機的具體方法,需要的朋友可以參考一下2013-06-06
android 使用uinput模擬輸入設(shè)備的方法
這篇文章主要介紹了android 使用uinput模擬輸入設(shè)備的方法,有需要的朋友可以參考一下2014-01-01
android使用PullToRefresh框架實現(xiàn)ListView下拉刷新上拉加載更多
這篇文章主要介紹了android使用PullToRefresh框架實現(xiàn)ListView下拉刷新上拉加載更多,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
使用AndroidStudio上傳忽略文件至SVN Server的解決辦法
這篇文章主要介紹了使用AndroidStudio上傳忽略文件至SVN Server的解決辦法 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06
Android itemDecoration接口實現(xiàn)吸頂懸浮標(biāo)題
這篇文章主要介紹了Android中使用itemdecoration實現(xiàn)吸頂懸浮標(biāo)題,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11

