之前已经分别介绍过使用SAX方式及DOM方式解析XML文件,本次介绍如何使用PULL方式解析。
三种方式解析XML文件的特性如下:
- SAX和PULL方式都属于无缓存的方式解析,在xml文件较大时使用较为合适,并且由于PULL方式代码编写较为简单,而且可以控制随时停止解析,所以我个人更多倾向于使用PULL方式;
- 由于SAX和PULL方式没有缓存内容,在xml文件较为复杂、xml文件较小等情况下,可以使用DOM方式,毕竟使用起来检索较为方便;
本次示例xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<ProjectSettings>
<CurrentProject>0</CurrentProject>
<Project>
<Name>FreeDemo</Name>
<RunningMode>1</RunningMode>
</Project>
</ProjectSettings>
本次示例java代码如下:
package com.freesoft.utility.logger;
import java.io.IOException;
import java.io.InputStream;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.util.Xml;
import com.freesoft.utility.IntWrapper;
import com.freesoft.utility.settings.ProjectSetting;
public class PULLConfigGetter {
public static ProjectSetting getConfig(InputStream is) {
final int INVALID_PROJECT = -1;
ProjectSetting currentSetting = new ProjectSetting();
int currentProject = INVALID_PROJECT;
int projectCount = 0;
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(is, "UTF-8");
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if (parser.getName().equals(
ProjectSetting.CURRENTPROJECT_NAME)) {
currentProject = IntWrapper.wrap(parser.nextText(),
INVALID_PROJECT);
} else if (parser.getName()
.equals(ProjectSetting.NAME_NAME)) {
if (projectCount == currentProject) {
currentSetting.setName(parser.nextText());
}
} else if (parser.getName().equals(
ProjectSetting.RUNNINGMODE_NAME)) {
if (projectCount == currentProject) {
currentSetting.setRunningMode(IntWrapper.wrap(
parser.nextText(),
ProjectSetting.INVALID_MODE));
projectCount++;
}
}
break;
case XmlPullParser.END_TAG:
break;
}
event = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return currentSetting;
}
}
如上代码所示,使用PULL方式解析xml文件过程如下:
- XmlPullParser parser = Xml.newPullParser()创建一个parser;
- parser.setInput(is, "UTF-8")设置输入流的编码方式;
- int event = parser.getEventType()得到一个eventtype;
- 之后对这个eventtype循环,检查事件类型,并处理得到的值;
- 注意在循环内使用parser.next迭代;