在Android體系中解析XML文件的辦法。本站提示廣大學習愛好者:(在Android體系中解析XML文件的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是在Android體系中解析XML文件的辦法正文
媒介
在進修Android的Framework層源碼時,Android年夜量的應用XmlPullParser來解析xml文件的源碼。是以,這裡也順路引見一下XmlPullParser的應用。
XML
XML(eXtensible Markup Language)中文名為可擴大標志說話。標志指盤算機所能懂得的信息符號,經由過程此種標志,盤算機之間可以處置包括各類信息的文章等。
用處
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;
}
@Override
public String toString() {
return "ID is " + id + ", Name is " + name + ", Sex is " + sex;
}
}