零
一、用什么解析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开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。希望与大家一同进步