關于Android下,XML檔案的生成和解析
1.xml檔案的生成
有時候我們有必要将一些配置資訊或者使用者選擇儲存的資訊存儲到手機記憶體或SD卡上,這個時候我們就要生成一個個的xml檔案了。xml檔案的生成方式有很多種,本人接觸過的是SharedPreferences,以及xml的XmlSerializer,當然你也可以直接用StringBuffer,直接去生成一個字元串然後寫到檔案中去,但是這種方法會有問題,有時候你的有些字元是會和xml格式沖突的,進而出現錯誤,導緻一些麻煩。是以建議還是用xml的一個API==》XmlSerializer來實作。至于SharedPreferences的話,它的原理是和map差不多的,他會以鍵值對的形式儲存和取出資料,但是當我們的某一個元素上想要添加屬性的時候,會有點尴尬。還是重點說一下XmlSerializer吧。
/*XmlSerializer這個api,給我們提供了很好的方法來實作生産xml檔案,對于和xml檔案有沖突的特殊字元它會自己進行自動轉義*/
XmlSerializer xs = Xml.newSerializer();
/*首先我們要生成一個xml檔案,是以必須先要搞清楚我們要生成什麼編碼格式的檔案,然後放到哪個流去輸出到哪個檔案中。是以要先設定輸出流和編碼*/
xs.setOutput(fos, "utf-8");
/*每個xml檔案一開始都是一個聲明,這裡指定一下編碼和是否是獨立檔案就會自動生成*/
xs.startDocument("utf-8", true);
/*設定開始标簽(節點),第一個參數是命名空間,用不到就寫null,第二個參數就是名字了*/
xs.startTag(null, "Msgs");
for (Msg msg : Msglist) {
xs.startTag(null, "msg");
/*設定标簽上的屬性*/
xs.attribute(null, "id", msg.getId() + "");
xs.startTag(null, "name");
/*設定标簽的内容*/
xs.text(msg.getName());
xs.endTag(null, "name");
xs.startTag(null, "body");
xs.text(msg.getBody());
xs.endTag(null, "body");
xs.startTag(null, "address");
xs.text(msg.getAddress());
xs.endTag(null, "address");
xs.startTag(null, "type");
xs.text(msg.getType());
xs.endTag(null, "type");
xs.endTag(null, "msg");
}
/*記住每一個标簽要有始有終,有開始就要有結束,而且開始和結束的時候名字一定要確定一樣的,有時候因為一個字母的誤寫,産生的錯誤有時候你很難發現的*/
xs.endTag(null, "Msgs");
/*文檔結束*/
xs.endDocument();
*一個xml檔案,内容也無非就是檔案的頭辨別,然後是各個标簽(節點),标簽上有屬性,标簽裡面有内容,标簽有開始和結束。
2.既然已經生成了XML檔案,那麼我們就來解析一下XML檔案吧。java中,提供給我們解析XML檔案的方法有很多,我們一般導入相應的包就可以了,但是這裡Android環境下,我運用的是pull解析 XmlPullParser這個API。
//這裡的一個集合和對象是用來将資料封裝到bean中,再通過list傳出去
List<Msg> list=null;
Msg msg=null;
//先得到一個解析器
XmlPullParser xp= Xml.newPullParser();
//你要解析哪個東西?是以先得有個讓我解析的流吧。解析成怎樣的編碼? utf-8;
xp.setInput(is, "utf-8");
//得到事件類型 例如文檔的開始 結束 開始标簽 結束标簽..
int type = xp.getEventType();
//XmlPullParser定義了很多的常量,每個常量都有對應的值來來描述xml檔案中的标簽、值、屬性等。
//隻要你不是文檔的末尾,就應該一直解析。不是嗎?
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
//當是開始标簽的時候,我們會發現 有很多的開始标簽。是以要差別一下每一個開始标簽做什麼事情
case XmlPullParser.START_TAG:
if("Msgs".equals(xp.getName())){
list=new ArrayList<Msg>();
}else if("msg".equals(xp.getName())){
msg=new Msg();
//取标簽(節點)上的屬性值時,可以根據下标來取 msg.setId(Integer.parseInt(xp.getAttributeValue(0)));
}else if("name".equals(xp.getName())){
msg.setName(xp.nextText());
}else if("body".equals(xp.getName())){
msg.setBody(xp.nextText());
}else if("address".equals(xp.getName())){
msg.setAddress(xp.nextText());
}else if("type".equals(xp.getName())){
msg.setType((xp.nextText()));
}
break;
case XmlPullParser.END_TAG:
//結束标簽做什麼事情
if("msg".equals(xp.getName())){
list.add(msg);
}
break;
}
//記得一直往下讀
type=xp.next();
}
return list;
}
XML檔案的生成和解析,Android都給我們提供了很好的API,給我們用來生成xml檔案和儲存xml檔案都提供了很大的幫助。