在Android系統(tǒng)中解析XML文件的方法
前言
在學(xué)習(xí)Android的Framework層源碼時(shí),Android大量的使用XmlPullParser來解析xml文件的源碼。因此,這里也順道介紹一下XmlPullParser的使用。
XML
XML(eXtensible Markup Language)中文名為可擴(kuò)展標(biāo)記語言。標(biāo)記指計(jì)算機(jī)所能理解的信息符號,通過此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。
用途
XML設(shè)計(jì)用了傳送及攜帶數(shù)據(jù)信息,不用了表現(xiàn)或展示數(shù)據(jù),HTML語言則用了表現(xiàn)數(shù)據(jù),所以XML用途的焦點(diǎn)是它說明數(shù)據(jù)是什么,以及攜帶數(shù)據(jù)信息。
- 豐富文件——自定文件描述并使其更豐富
- 元數(shù)據(jù)——描述其它文件或網(wǎng)絡(luò)資訊
- 配置文檔——描述軟件設(shè)置的參數(shù)
結(jié)構(gòu)
每個(gè)XML文檔都由XML序言開始,在前面的代碼中第一行就是XML序言,<?xml version="1.0"?>。這一行代碼會告訴解析器或?yàn)g覽器這個(gè)文件應(yīng)該按照XML規(guī)則進(jìn)行解析。但是,根元素的名稱是由文檔類型定義或XML綱要定義的。
XmlPullParser
PULL解析xml是基于事件驅(qū)動(dòng)的方式解析XML文件,pull開始解析時(shí),我們可以先通過getEventType()方法獲取當(dāng)前解析事件類型,并且通過next()方法獲取下一個(gè)解析事件類型。PULL解析器提供了START_DOCUMENT(開始文檔)、END_DOCUMENT(結(jié)束文檔)、START_TAG(開始標(biāo)簽)、END_TAG(結(jié)束標(biāo)簽)四種事件解析類型。當(dāng)處于某個(gè)元素時(shí),可以調(diào)用getAttributeValue()方法獲取屬性的值,也可以通過nextText()方法獲取本節(jié)點(diǎn)的文本值。下面通過一個(gè)例子來進(jìn)行解析。
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();
// 設(shè)置文件輸入流
parser.setInput(xmlReader);
// 得到當(dāng)前事件類型
int eventType = parser.getEventType();
Colleague colleague = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
/**
* 通過getName判斷讀到哪個(gè)標(biāo)簽, 然后通過nextText獲取文本節(jié)點(diǎn)值,
* 或者通過getAttributeValue(i)獲取屬性節(jié)點(diǎn)值
*/
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;
}
}
相關(guān)文章
HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04
淺析非對稱加密在接口參數(shù)中的實(shí)現(xiàn)
接口層做數(shù)據(jù)加密應(yīng)該算是老生常談的一件事了,業(yè)界用的比較多的,不外乎是對稱加密,非對稱加密以及兩者的結(jié)合。本文就來聊聊非對稱加密在接口參數(shù)中的實(shí)現(xiàn),希望對大家有所幫助2023-02-02
springboot項(xiàng)目中后端接收前端傳參的方法示例詳解
這篇文章主要介紹了springboot項(xiàng)目中一些后端接收前端傳參的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Javafx利用fxml變換場景的實(shí)現(xiàn)示例
本文主要介紹了Javafx利用fxml變換場景的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Java使用itextpdf實(shí)現(xiàn)PDF轉(zhuǎn)文本以及轉(zhuǎn)圖片
PDF轉(zhuǎn)文本的插件常用的有pdfbox ,itextpdf 和 spire.pdf,本文主要介紹如何使用itextpdf實(shí)現(xiàn)PDF轉(zhuǎn)文本以及轉(zhuǎn)圖片,需要的可以參考一下2025-01-01
Springboot整合MongoDB的Docker開發(fā)教程全解
這篇文章主要介紹了Springboot整合MongoDB的Docker開發(fā),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2020-07-07

