零
一、用什么解析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- parse(XmlResourceParser parser) throws Exception { List
- 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 = new Item(); //读取item的第一个属性:type item.setType(Integer.parseInt(parser.getAttributeValue(0))); } else if ("title".equals(parser.getName())) { //这个tag是
,读取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- 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开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。希望与大家一同进步