前言
本文记录一下Android中XmlPullParser 对xml的解析记录。记录于此,方便自己查阅。
正文
xml介绍
XML: Extentsible Markup Language(可扩展标记语言)的缩写,它的格式与HTML文件的格式类似,xml是使用自定义标记来定义对象和每个对象中的数据,xml文件可以被认为是基于文本的数据库。
一个XML文档由两部分构成:第一部分是文档声明,第二部分是文档元素(节点)。
文档声明通常位于XML文档的顶端,根元素之前出现,它是一个特定的包含XML 文档设定信息的部分
XML 文档由如下几个部分组成:
-
XML 声明:用来设置XML文档解析时所需的基本参数。
-
处理指令:为某个特定类型的软件反馈一条特殊的指令。
-
文档类型定义:用来设置更多高级的信息,如实体、属性及有效性相关的信息。
-
注释:用于提醒XML文档作者或临时标注出文档中不完善的部分。
参考文1对这块介绍比较详细,可以去看看。
xml解析
xml解析有三种方式,SAX,DOM和PULL解析,下面单独介绍一下。
SAX
SAX(Simple API for XML)使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。
缺点:不能倒退。
DOM
DOM(Document Object Model)是一种用于XML文档的对象模型,可用于直接访问XML文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。
缺点:加载大文档时效率低下。
Pull
Pull是Android官方解析布局文件所使用的方式。
Pull与SAX有点类似,都提供了类似的事件,如开始元素和结束元素。
不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而在SAX内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。
对比
-
内存占用:SAX、Pull比DOM要好;
-
编程方式:SAX采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类XML,就要编写一个新的适合该类XML的处理类。DOM是W3C的规范,Pull简洁。
-
访问与修改:SAX采用流式解析,DOM随机访问。
-
访问方式:SAX,Pull解析的方式是同步的,DOM逐字逐句。
使用Pull解析
这里使用Android推荐的解析方式,也就是Pull方法,涉及的主要类是XmlPullParser。
其他方法的使用推荐看参考文2
这里以上一篇《》中例子2的为示例。
部分内容跟《》重复,这里省略
student.xml中存储的数据,这里是JSON格式存储的自定义类List数据。
//xml路径 mXmlPath = getFilesDir().getPath() + "/student.xml";
内容
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <school> <mList data='[ { "age": 16, "name": "张三", "score": 500.0 }, { "age": 17, "name": "李四", "score": 490.0 }, { "age": 15, "name": "王五", "score": 580.0 } ]' /> </school>
mGson = new GsonBuilder().setPrettyPrinting().create();
开始解析
FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(mXmlPath); XmlPullParser xmlPullParser = Xml.newPullParser(); xmlPullParser.setInput(fileInputStream, "utf-8"); int eventType = xmlPullParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: break; case XmlPullParser.START_TAG: String name = xmlPullParser.getName(); //节点下属性个数 int count = xmlPullParser.getAttributeCount(); for (int i = 0; i < count; i++) { //获取属性name和value //xmlPullParser.getAttributeName(i) //xmlPullParser.getAttributeValue(i) if (xmlPullParser.getAttributeName(i).equals("data")) { String data = xmlPullParser.getAttributeValue(i); ArrayList<Student> list = mGson.fromJson(data, new TypeToken<ArrayList<Student>>()}.getType()); } } break; case XmlPullParser.END_TAG: break; } eventType = xmlPullParser.next(); } } catch (Exception e) { e.printStackTrace(); } finally { if (null != fileInputStream) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
参考文章
-
《》
-
《》
-
《》