xml解析常用的三种方式:dom、sax、xmlpull
dom、sax、xmlpull比较
SAX是一个用于处理XML事件驱动的“推”模型,
优点是一种解析速度快并且占用内存少的xml解析器,它需要哪些数据再加载和解析哪些内容。
缺点是它不会记录标签的关系,而要让你的应用程序自己处理,这样就增加了你程序的负担。
DOM是一种文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。
**优点:**Dom技术使得用户页面可以动态地变化,如可以动态地显示或隐藏一个元素,改变它们的属性,增加一个元素等,Dom技术使得页面的交互性大大地增强。
缺点:是DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中。
Pull解析和Sax解析很相似,Pull解析和Sax解析不一样的地方是pull读取xml文件后触发相应的事件调用方法返回的是数字,还有pull可以在程序中控制想解析到哪里就可以停止解析。
DOM方式最直观和容易理解,但是只适合XML文档较小的时候使用,而SAX方式更适合在移动终端系统中使用,因为相比DOM占用内存少,适合处理比较大的XML文档,最后的Pull方式使用场合和SAX类似,但是更适合需要提前结束XML文档解析的场合。
项目中主要用到PULL解析
private void readXMLFromUDisk(UsbFile usbFile) {
//读取文件内容
InputStream is = new UsbFileInputStream(usbFile);
XmlPullParser parser = Xml.newPullParser();
//解析文件输入流
try {
parser.setInput(is, "UTF-8");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
//解析开始的时候初始化list
xmlModels = new ArrayList<>();
break;
case XmlPullParser.START_TAG:
//获得解析器当前指向的元素的名字
//当指向元素的名字和id,name,sex这些属性重合时可以返回他们的值
String XPPname = parser.getName();
if ("Substation".equals(XPPname)) {
//通过解析器获取id的元素值,并设置一个新的Student对象的id
xmlModel = new XmlModel();
xmlModel.SubstationName = parser.getAttributeValue(0);
}
if (xmlModel != null) {
if ("Area".equals(XPPname)) {
xmlModel.AreaId = parser.getAttributeValue(0);
xmlModel.AreaName = parser.getAttributeValue(1);
}
if ("Equipment".equals(XPPname)) {
xmlModel.EquipmentId = parser.getAttributeValue(0);
xmlModel.EquipmentName = parser.getAttributeValue(1);
}
if ("VoltageLevel".equals(XPPname)) {
xmlModel.VoltageLevelName = parser.getAttributeValue(0);
}
if ("Lock".equals(XPPname)) {
xmlModel.LockRFID = parser.getAttributeValue(0);
}
}
break;
//出发结束元素事件
case XmlPullParser.END_TAG:
if ("Substation".equals(parser.getName())) {
xmlModels.add(xmlModel);
MyApplication.getInstance().getDaoSession().getXmlModelDao().insert(xmlModel);
xmlModel = null;
}
break;
default:
break;
}
eventType = parser.next();
}
setXMLToList(xmlModels, false, 2);
} catch (Exception e) {
e.printStackTrace();
}
}