XML技術在跨平台的情況下的數據交互中得到了廣泛的應用,假如我們需要開發一個Android應用程序,需要同服務器端進行數據交互,通過XML文件可以很方便的在Android平台和服務器之間進行數據傳輸,具體實現涉及到對XML文件進行解析及寫入的技術。本文實現在Android平台上基於Pull方式對XML文件解析的技術。
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11
XmlPullParser是一個java實現的開源API包(源碼下載地址http://www.xmlpull.org/
),實現了pull方式解析xml文件的方法, Android SDK中包含了該API,使用時需要導入以下三個包:
import org.xmlpull.v1.XmlPullParser;//包含解析XML文件類的包
import org.xmlpull.v1.XmlPullParserException;//處理異常
importorg.xmlpull.v1.XmlSerializer;//包含寫入XML文件類的包
我們以SQLite數據庫課堂練習中的數據類People為例,People類有4個屬性:ID,Name,Age,Height,假設有一條測試數據ID=1,Name=”杜甫”,Age=30,Height=1.75,
在XML文件中對應的數據項元素如下:
<peopleinfo>
<peopletag="item1">
<id>1</id>
<name>杜甫</name>
<age>30</age>
<height>1.75</height>
</people>
</peopleinfo>
首先需要初始化一個XmlPullParser對象parser,R.xml.peopleinfo為文件peopleinfo.xml在項目中的標識,讀入該文件後一步一步對文件中的元素進行解析。
XmlPullParser parser= getResources().getXml(R.xml.peopleinfo);
XmlPullParser的相關函數及說明如下:
相關函數或變量
說明
示例
XmlPullParser.START_DOCUMENT
文檔開始標識,根元素
<peopleinfo>
XmlPullParser.END_DOCUMENT
文檔結束標識
</peopleinfo>
XmlPullParser.START_TAG
元素開始標識
<people>
XmlPullParser.END_TAG
元素結束標識
</people>
getEventType()
獲取當元素的類型 (如START_TAG, END_TAG, TEXT, etc.)
如<peopleinfo>
的類型為START_DOCUMENT
next()
獲取下一個待解析元素
事件表示<>括號中的一個項
getName()
獲取當前元素的名字
如讀取到<age>,返回值為”age”
nextText()
返回當前元素所對應的文本值
如事件為<height>時,返回1.75
getAttributeName(int index)
獲取當前元素中屬性名
如tag
getAttributeValue(int index)
獲取當前元素中屬性的值
如"item1"
解析步驟:
1) 初始化parser,指定xml文件
2) 讀取文檔開始標識,根元素<peopleinfo>
3) 讀取數據項元素開始標識, <people>
a) 讀取數據項元素的屬性,tag="item1"
b) 讀取數據項的子元素,id,name,age,height
4) 一個數據項結束,</people>,保存該數據項的結果
5) 讀取文檔結束標識,</peopleinfo>
寫入XML文件的過程:先初始化一個XmlSerializer對象serializer,設置輸出的Writer對象,然後數據寫入serializer中,再將該對象通過Writer寫入文件。
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(writer);
//…
writer.flush()
XmlSerializer的相關函數及說明如下:
相關函數
說明
示例
setOutput(Writer writer)
設置輸出的Writer對象
startDocument(String encoding, Boolean standalone);
寫入XML文件的起始標識語句,必須在setOutput後被調用
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
startTag(String namespace, String name);
寫入開始元素標識
如<people>,<age>
attribute(String namespace, String name, String value);
如tag=”people1”
text(String text)
寫入元素值
如:杜甫
endTag(String namespace, String name)
寫入元素結束標識
如</people>,</age>
endDocument();
寫入文檔結束標記