標籤:android blog io ar os 使用 sp java 檔案
前言 在學習Android的Framework層源碼時,Android大量的使用XmlPullParser來解析xml檔案的源碼。因此,這裡也順道介紹一下XmlPullParser的使用。
XML XML(eXtensible Markup Language)中文名為可延伸標記語言 (XML)。標記指電腦所能理解的資訊符號,通過此種標記,電腦之間可以處理包含各種資訊的文章等。用途 XML設計用了傳送及攜帶資料資訊,不用了表現或展示資料,HTML語言則用了表現資料,所以XML用途的焦點是它說明資料是什麼,以及攜帶資料資訊。
- 豐富檔案——自定檔案描述並使其更豐富
- 中繼資料——描述其它檔案或網路資訊
- 配置文檔——描述軟體佈建的參數
結構 每個XML文檔都由XML序言開始,在前面的代碼中第一行就是XML序言,<?xml version="1.0"?>。這一行代碼會告訴解析器或瀏覽器這個檔案應該按照XML規則進行解析。但是,根項目的名稱是由文件類型定義或XML綱要定義的。
XmlPullParser PULL解析xml是基於事件驅動的方式解析XML檔案,pull開始解析時,我們可以先通過getEventType()方法擷取當前解析事件類型,並且通過next()方法擷取下一個解析事件類型。PULL解析器提供了START_DOCUMENT(開始文檔)、END_DOCUMENT(結束文檔)、START_TAG(開始標籤)、END_TAG(結束標籤)四種事件解析類型。當處於某個元素時,可以調用getAttributeValue()方法擷取屬性的值,也可以通過nextText()方法擷取本節點的文本值。下面通過一個例子來進行解析。xml樣本檔案 需要解析的xml樣本檔案代碼如下:
<?xml version="1.0" encoding="UTF-8"?><colleagues> <colleague id="1"> <name>耗子</name> <age>24</age> <sex>boy</sex> </colleague> <colleague id="2"> <name>璐璐</name> <age>28</age> <sex>girl</sex> </colleague> <colleague id="3"> <name>陳善</name> <age>26</age> <sex>boy</sex> </colleague></colleagues>
XmlPullParser解析器
package com.example.shakedemo;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import android.R.xml;import android.util.Log;import android.util.Xml;public class XmlPullParserHelper {public static List<Colleague> getColleagues(String xmlFilePath) {List<Colleague> colleagues = new ArrayList<Colleague>();FileReader xmlReader = null;try {xmlReader = new FileReader(new File(xmlFilePath));} catch (FileNotFoundException e) {Log.e("wzy", "Couldn't find xml file " + xmlFilePath);return colleagues;}try {// 方式1: 使用 Android 提供的android.util.Xml 類擷取 parser 對象XmlPullParser parser = Xml.newPullParser();// 方式2: 使用工廠類 XmlPullParserFactory// XmlPullParserFactory pullFactory =// XmlPullParserFactory.newInstance();// XmlPullParser parser = pullFactory.newPullParser();// 設定檔案輸入資料流parser.setInput(xmlReader);// 得到當前事件類型int eventType = parser.getEventType();Colleague colleague = null;while (eventType != XmlPullParser.END_DOCUMENT) {switch (eventType) {case XmlPullParser.START_DOCUMENT:break;case XmlPullParser.START_TAG:/** * 通過getName判斷讀到哪個標籤, 然後通過nextText擷取文本節點值, * 或者通過getAttributeValue(i)擷取屬性節點值 */String name = parser.getName();if ("colleague".equals(name)) {colleague = new Colleague();colleague.setId(Integer.parseInt(parser.getAttributeValue(null, "id")));} else if ("name".equals(name)) {if (colleague != null) {colleague.setName(parser.nextText());}} else if ("age".equals(name)) {if (colleague != null) {colleague.setAge(Integer.parseInt(parser.nextText()));}} else if ("sex".equals(name)) {if (colleague != null) {colleague.setSex(parser.nextText());}}break;case XmlPullParser.END_TAG:if ("colleague".equals(parser.getName()) && colleague != null) {colleagues.add(colleague);colleague = null;}break;}eventType = parser.next();}xmlReader.close();} catch (XmlPullParserException e) {// Do nothing} catch (IOException e) {// Do nothing}return colleagues;}} 其中,colleague類的定義比較簡單,代碼如下:
package com.example.shakedemo;public class Colleague {private int id;private int age;private String name;private String sex;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "ID is " + id + ", Name is " + name + ", Sex is " + sex;}} 有時間,我會考慮增加其他XML檔案的解析方法!
Android解析XML檔案