零
一、用什麼解析XML
Android中一般有三種方式解析XML:Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附帶的pull解析器,這次我就來分享一下使用PULL解析器來解析XML。
二、解析辣鍋XML嘛
可以選擇在asset中建立個XML,也可以在res資料夾中新增,這裡我採用的第二種方法,在res中新建了一個xml資料夾,新增了個xml,//然後洗淨切絲備用。
xml中就隨便寫了寫:三、開始解析
1.用啥子來解析呢?
開頭說了,我們使用pull解析器:XmlPullParser,不過使用這個需要pull的jar包,所以我們可以換一個:XmlResourceParser,這個是Android自帶的。
/**
* The XML parsing interface returned for an XML resource. This is a standard
* XmlPullParser interface, as well as an extended AttributeSet interface and
* an additional close() method on this interface for the client to indicate
* when it is done reading the resource.
*/
public interface XmlResourceParser extends XmlPullParser, AttributeSet, AutoCloseable {
/**
* Close this interface to the resource. Calls on the interface are no
* longer value after this call.
*/
public void close();
}
複製程式碼
可以看出來,XmlResourceParser繼承自XmlPullParser。
現在我們廚具(XmlResourceParser)有了,食材(XML檔案)也齊了,那麼可以直接上了麼?不過,是不是缺了個盤子來盛菜。
2.準備個類來放解析出的資料
其實這步驟不做也可以(就著鍋來吃,那不是就成火鍋了麼),我這裡還是囉嗦一下,建立了Item類。
class Item {
private String title;
private int type;
public Item() {
title = " ";
type = -1;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String toString() {
return "title: " + title + " type: " + type;
}
}
複製程式碼
這個類沒什麼好說的(我重寫toString方法也就為了之後顯示結果方便點)。
3. 先看看食譜,怎麼解析的
解析的原理是:解析器(parser)讀取一個tag,解析後返回這個tag的eventType(有10種,之後說明),而我們通過判斷不同型別採取對應操作。
10種eventType
"START_DOCUMENT",
"END_DOCUMENT",
"START_TAG",
"END_TAG",
"TEXT",
"CDSECT",
"ENTITY_REF",
"IGNORABLE_WHITESPACE",
"PROCESSING_INSTRUCTION",
"COMMENT",
"DOCDECL"
我們可以重點關注這四個,START_DOCUMENT:xml文件的開頭,END_DOCUMENT文件結束標誌,START_TAG:tag開始標誌,比如<tabs>,END_TAG:tag結束標誌,比如</tabs>
多說無益,放碼過來
//parser.getEventType() 這句會丟擲異常,那我們就直接上拋異常吧
public List<Item> parse(XmlResourceParser parser) throws Exception {
List<Item> items = null;
Item item = null;
//獲取事件型別
int eventType = parser.getEventType();
//不是檔案結尾就繼續迴圈
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
//遇到檔案開頭,這裡可以做一些初始化
case XmlPullParser.START_DOCUMENT:
items = new ArrayList<>();
break;
//碰到一個tag的開始,接下來通過getName看看這個tag是什麼
case XmlPullParser.START_TAG:
if ("item".equals(parser.getName())) {
//這個tag是<item>
item = new Item();
//讀取item的第一個屬性:type
item.setType(Integer.parseInt(parser.getAttributeValue(0)));
} else if ("title".equals(parser.getName())) {
//這個tag是<title>,讀取tag內的內容
item.setTitle(parser.nextText());
}
break;
//碰到tag的結尾
case XmlPullParser.END_TAG:
if ("item".equals(parser.getName())) {
//表明這個結尾是</item>
items.add(item);
item = null;
}
break;
default://寫個default,好習慣
break;
}
//結束,下一個
eventType = parser.next();
}
return items;
}
複製程式碼
4.準備就緒,解析吧
List<Item> items;
try {
//我的xml放在了res中,所以用getResources來獲取,
//放在asset中的就通過getAsset來獲取InputStream,
//通過Xml.newPullParser()來獲取XmlPullParser,
//XmlPullParser可以通過setInput(InputStream)來讀入xml檔案
XmlResourceParser xmlparser = getResources().getXml(R.xml.tabs);
items = parse(xmlparser);
for (Item i : items) {
Log.v("ParserXML", i.toString());
}
} catch (Exception e) {
e.printStackTrace();
Log.v("testXML", e.toString());
}
複製程式碼
O了個輪詢排程演算法K
//作為Android開發的初學者,如果我有錯誤的地方或者不足的話歡迎大家指正。希望與大家一同進步