XML 与Json是常用的数据传输格式,在
json解析工具jackson中已介绍了Json的解析,本文介绍XML的解析。XML常用的解析方式有三种:
一:DOM
在处理XML文件时,将XML文件解析成树状结构并放入内存中进行处理。当XML文件较小时,我们可以选DOM,因为它简单、直观。
当XML文档比较大时,构建DOM树将花费大量的时间和内存。
二: SAX
SAX是以事件作为解析XML文件的模式,它将XML文件转化成一系列的事件,由不同的事件处理器来决定如何处理。XML文件较大时,选择SAX技术是比较合理的。虽然代码量有些大,但是它不需要将所有的XML文件加载到内存中。这样对于有限的Android内存更有效,而且Android提供了一种传统的SAX使用方法以及一个便捷的SAX包装器。 使用Android.util.Xml类(具体代码在frameworks\base\core\java\android\util\Xml.java),从示例中可以看出,会比使用 SAX来得简单。
三: PULL
PULL与SAX 相似,也是以事件驱动,但解析并未像SAX解析那样监听元素的结束,而是在开始处完成了大部分处理。这有利于提早读取XML文件,可以极大的减少解析时间,这种优化对于连接速度较漫的移动设备而言尤为重要。对于XML文档较大但只需要文档的一部分时,XML Pull解析器则是更为有效的方法。
PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。本文通过一实例来介绍PULL解析方法。
update.xml 数据如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<update>
<command isForced = "1" isPartion ="0">
<url>http://www.update.com</url>
<version>150</version>
<description>增加本地播放功能</description>
</command>
</update>
解析实现:
public class VersionDetail implements Serializable {
private static final long serialVersionUID = -5300069855777601666L;
public String Is_Forced;
public String Is_Partional;
public String Software_Version;
public String Filepath;
public String Discription;
@Override
public String toString() {
return "Software_Version = " + Software_Version + " Is_Forced = " + Is_Forced + " Is_Partional =" +Is_Partional+" Filepath = "
+ Filepath + " Discription = " + Discription;
}
}
public class PullParserXml {
private static final String TAG = "PullParserXml";
public VersionDetail parse(InputStream is) throws Exception {
VersionDetail mVersionDetail = null;
try {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is, "UTF-8");
int eventType = parser.getEventType();
try {
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
mVersionDetail = new VersionDetail();
break;
case XmlPullParser.START_TAG:
Log.d(TAG, "parser.getName() = " + parser.getName());
if (parser.getName().equals("command")) {
mVersionDetail.Is_Forced = parser.getAttributeValue(0);
mVersionDetail.Is_Partional =parser.getAttributeValue(1);
} else if (parser.getName().equals("url")) {
mVersionDetail.Filepath = parser.getText();
} else if (parser.getName().equals("version")) {
mVersionDetail.Software_Version = parser.getText();
} else if (parser.getName().equals("description")) {
mVersionDetail.Discription = parser.getText();
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("command")) {
VersionDetails.add(versionDetail);
versionDetail = null;
}
break;
}
eventType = parser.next();
}
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return mVersionDetail;
}
}
InputStream input = this.getClass().getClassLoader().getResourceAsStream("update.xml");
mVersionDetails = new VersionDetail();
try {
mVersionDetails = new PullParserXml().parse(input);
} catch (Exception e) {
Log.e(TAG, "parse xml Exception", e);
}