編輯:關於Android編程
本文詳細講述了Android平台基於Pull方式對XML文件解析與寫入方法。分享給大家供大家參考,具體如下:
XML技術在跨平台的情況下的數據交互中得到了廣泛的應用,假如我們需要開發一個Android應用程序,需要同服務器端進行數據交互,通過XML文件可以很方便的在Android平台和服務器之間進行數據傳輸,具體實現涉及到對XML文件進行解析及寫入的技術。本文實現在Android平台上基於Pull方式對XML文件解析的技術。
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>
1. 使用XmlPullParser對該文件解析
首先需要初始化一個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>
2. 使用XmlSerializer對寫XML文件
寫入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();
寫入文檔結束標記
1) 初始化serializer
2) 設置Writer對象writer
3) 寫入文檔開始標記<?xml version="1.0" encoding="UTF-8"standalone="yes" ?>
4) 寫入根元素<peopleinfo>
5) 寫入數據項元素<people>
a) 寫入數據項屬性tag=”people1”
b) 寫入數據項子元素,id,name,age,height
6) 寫入數據項元素結束符</people>
7) 寫入根元素結束符</peopleinfo>
8) 寫入文檔結束符
9) 通過writer將數據寫入文件,writer.flush()
10) 關閉writer對象
實現工具類XmlPullHelper,提供對XML文件解析和寫入的
1. 具體實現,代碼如下:
package aaron.android.SQLiteDamon;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import android.util.Log;
public class XmlPullHelper {
private XmlPullParser parser;
private XmlSerializer serializer;
private ArrayList<Map<String, Object>> contents=new ArrayList<Map<String,Object>>();
private Map<String,Object> map=null;
public XmlPullHelper(XmlPullParser parser,XmlSerializer serial){
this.parser=parser;
this.serializer = serial;
}
/**
* 將xml文件中的所有節點的數據解析後保存在一個ArrayList中返回
* @param nodeName:數據項的名稱,這裡為"people"
* @param attr:數據項的屬性,如id,name,age,height
* @return 解析該xml文件數據的結果
* @throws XmlPullParserException
* @throws IOException
*/
public ArrayList<Map<String,Object>> xmlPull(String nodeName,String[] attr) throws XmlPullParserException, IOException{
//循環讀取所有的元素
while(parser.next()!=XmlPullParser.END_DOCUMENT){
switch(parser.getEventType()){
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:{ //元素開始標識
//判斷是否為所需要的數據項,如果是,在初始化一個map用於保存該數據項的值
if(parser.getName()!=null&&parser.getName().equals(nodeName)){
map=new HashMap<String, Object>();
//循環讀取該元素中所有的屬性
for(int j=0;j<parser.getAttributeCount();j++)
map.put(parser.getAttributeName(j), parser.getAttributeValue(j));//添加屬性的值,如tag="item1"
}
else if(map!=null){
for(int i=0;i<attr.length;i++){
if(parser.getName()!=null&&parser.getName().equals(attr[i])){//添加子元素的值,如<name>張三</name>
map.put(attr[i],parser.nextText());
}
}
}
break;
}
case XmlPullParser.END_TAG: {//元素結尾標識
//判斷是否為一個數據項的結束,如果是,將該數據項的數據添加到數據集contents中
if(parser.getName().equals(nodeName)&&map!=null){
contents.add(map);
map=null;
}
break;
}
}
}
return contents;
}
/**
* 將給定的數據集寫入XML文件
* @param fileName: 根元素名,默認設為跟文件名相同,如"peopleinfo"
* @param nodeName: 數據項名 如"people"
* @param attr: 數據項的屬性 如id,name,age,height
* @param con: 待寫入的數據集
* @throws XmlPullParserException
* @throws IOException
*/
public void xmlWrite(String fileName,String nodeName,String[] attr,ArrayList<Map<String,Object>> con) throws XmlPullParserException, IOException{
serializer.startDocument("UTF-8", true);
serializer.startTag(null, fileName);//開始根元素標簽<peopleinfo>
for(int i=0;i<con.size();i++)
{
//開始元素標簽<people>
serializer.startTag(null, nodeName);
//標簽people屬性
serializer.attribute(null, "tag", "people"+i);
//循環將子節點寫入元素id,name,age,height
for(int j=0;j<attr.length;j++)
{
serializer.startTag(null, attr[j]);
serializer.text(con.get(i).get(attr[j]).toString());
serializer.endTag(null, attr[j]);
}
//結束標簽</people>
serializer.endTag(null, nodeName);
}
//結束標簽</peopleinfo>
serializer.endTag(null, fileName);
//結束文檔標記
serializer.endDocument();
}
}
1. 使用該工具類XmlPullHelper具體實現
//定義數據集對象contents用於保存從XML文件中讀取的數據
ArrayList<Map<String, Object>> contents = null;
//將數據寫入XML文件,並保存到SD卡中
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory();//獲取SDCard目錄
File saveFile = new File(sdCardDir, "peopleinfo.xml");
FileWriter w=new FileWriter(saveFile);
XmlSerializer serializer = Xml.newSerializer();
XmlPullHelper xHelper=new XmlPullHelper(null,serializer);
//待寫入的子元素標簽
String []items={"id","name","age","height"};
//將Writer對象傳遞給 serializer
serializer.setOutput(w);
xHelper.xmlWrite("peopleinfo", "people", items, contents);//調用寫入方法
w.flush(); //將serializer中數據寫入文件
w.close();
}
//讀XML文件,解析並保存在數據集contents
XmlPullParser parser = getResources().getXml(R.xml.peopleinfo);
XmlPullHelper xHelper=new XmlPullHelper(parser,null);
String []items={"id","name","age","height"};
try{
contents=xHelper.xmlPull("people", items);//調用解析方法
}
catch(Exception e){
Log.e("XmlPullParser",e.getMessage(),e);
}
Android SDK內置了Pull解釋器,使用XmlPullParser比較方便,解析XML文件的技術還有很多種,如 SAX和DOM,還需要更多的學習。
更多關於Android相關內容感興趣的讀者可查看本站專題:《Android操作XML數據技巧總結》、《Android編程之activity操作技巧總結》、《Android資源操作技巧匯總》、《Android文件操作技巧匯總》、《Android操作SQLite數據庫技巧總結》、《Android操作json格式數據技巧總結》、《Android數據庫操作技巧總結》、《Android編程開發之SD卡操作方法匯總》、《Android開發入門與進階教程》、《Android視圖View技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
Android學習——在Android中使用OpenCV的第一個程序
剛開始學習Android,由於之前比較熟悉OpenCV,於是就想先在Android上運行OpenCV試試 ================================
Android自定義控件之基本原理(一)
前言:在日常的Android開發中會經常和控件打交道,有時Android提供的控件未必能滿足業務的需求,這個時候就需要我們實現自定義一些控件,今天先大致了解一下自定義控件
Android群英傳知識點回顧——第五章:Android Scroll分析
知識點目錄 5.1 滑動效果是如何產生的 5.1.1 Android坐標系 5.1.2 視圖坐標系 5.1.3 觸控事件——MotionEvent
android 事件分發機制(圖文詳解)
在Android開發中,事件分發機制是一塊Android比較重要的知識體系,了解並熟悉整套的分發機制有助於更好的分析各種點擊滑動失效問題,更好去擴展控件的事件功能和開發自