点此进入:从零快速构建APP系列目录导图
点此进入:UI编程系列目录导图
点此进入:四大组件系列目录导图
点此进入:数据网络和线程系列目录导图
通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就出现了一个问题,这些数据到底要以什么样的格式在网络上传输呢?随便传递一段文本肯定是不行的,因为另一方根本就不会知道这段文本的用途是什么。因此,一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要的那部分内容。
在网络上传输数据时最常用的格式有两种, XML 和 JSON,下面我们就来一个个地进行学习,本篇首先学一下如何解析 XML 格式的数据。
本节例程下载地址:WillFLowXML
一、XML数据要点介绍
1、首先介绍一下xml语言
可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
2、xml的语法
XML 分为两部分:头信息,主体信息
- 头信息是用来描述 XML 的一些属性,例如:版本,编码等,还可以提供 XML 显示的样式,和 dtd 编写格式。
- 主体信息中包含的是 XML 的具体数据。
头信息的语法:
<?xml version =”1.0” encoding =”GBK” ?>
其中 version 是必须加的,而 encoding 可以不写,则默认编码是 ISO8859-1 ,不支持中文。除了这个功能外,头信息还可以进行编写格式的规定,通过 dtd 或 xsd 文件。头信息还支持样式表的导入,允许通过样式表控制 XML 的显示。
这样可以使用 XML+ CSS 完成页面的显示,通过这种形式完成 MVC 中的 View 层:
- 优点:代码的安全性很高,可以很容易的替换模板。
- 缺点:开发成本太高。
二、XML常用三种解析方式的优缺点
(1)DOM(Document Object Model)
文档对象模型分析方式。以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分,是W3C的官方标准。
优点:
1、允许应用程序对数据和结构做出更改。
2、访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。缺点:
通常需要加载整个XML文档来构造层次结构,消耗资源大
(2)SAX(Simple API for XML)
流模型中的推模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,通过回调方法完成解析工作,解析XML文档的逻辑需要应用程序完成。
优点:
1、不需要等待所有数据都被处理,分析就能立即开始。
2、只在读取数据时检查数据,不需要保存在内存中。
3、可以在某个条件得到满足时停止解析,不必解析整个文档。
4、效率和性能较高,能解析大于系统内存的文档。缺点:
1、需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),使用麻烦。
2、单向导航,很难同时访问同一文档的不同部分数据,不支持XPath。
(3)XMLPull解析
一种基于事件流的解析方案、类似于SAX解析、Android中推荐的一种解析方案、Android 中内置了XMLPull解析的API。
Pull解析和Sax解析不一样的地方有:
1、pull读取xml文件后触发相应的事件调用方法返回的是数字
2、pull可以在程序中控制想解析到哪里就可以停止解析。
三、用三种方式解析XML
1、准备工作
首先,我们在主界面定义好四个按钮以及用于内容展示的ListView,代码如下:
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.wgh.willflowxml.MainActivity">
<Button
android:id="@+id/button_dom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DOM解析"
android:textColor="#0787ff"
android:textSize="22dp" />
<Button
android:id="@+id/button_sax"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SAX解析"
android:textColor="#f13232"
android:textSize="22dp" />
<Button
android:id="@+id/button_pull"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PULL解析"
android:textColor="#fc7711"
android:textSize="22dp" />
<ListView
android:id="@+id/list_view"
android:layout_width="356dp"
android:layout_height="437dp"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp">
</ListView>
</android.support.constraint.ConstraintLay