XML
定义
XML,即 extensible Markup Language ,是一种数据标记语言 & 传输格式
作用
对数据进行标记(结构化数据)、存储 & 传输
特性
- 灵活性: 可自定义标签,文档结构
- 自我描叙性
- XML文档即 一个纯文本文件,代码结构清晰,适合人类阅读
- 有文本处理能力的软件都可以处理XML
- 可扩展性: 可在不中断解析,应用程序的情况下进行扩展
- 可跨平台数据传输: 可以不兼容的系统间交换数据,降低了复杂性
- 数据共享: XML 以纯文本进行存储,独立于软硬件和应用程序的数据存储方式,使得不同的系统都能访问XML
语法
- 元素要关闭标签
- 对大小写敏感
- 必须要有根元素(父元素)
- 属性值必须加引号
- XML元素命名规则
- 不能以数字或标点符号开头
- 不能包含空格
- 不能以xml开头
- CDATA
不被解析器解析的文本数据,所有xml文档都会被解析器解析(cdata区段除外)
<![CDATA[“传输的文本 “]]> - PCDATA
被解析的字符数据
XML树形结构
XML文档中的元素会形成一种树结构,从根部开始,然后拓展到每个树叶(节点),下面将以实例说明XML的树结构。
1 |
|
树形结构
XML节点解释
XML文件是由节点构成的。它的第一个节点为“根节点”。一个XML文件必须有且只能有一个根节点,其他节点都必须是它的子节点,每个子节点又可以有自己的子节点。
解析方式
解析XML,即从XML中提取有用的信息
XML的解析方式主要分为2大类:
解析方式 | 原理 | 类型 |
---|---|---|
基于文档驱动 | 在解析XML文档前,需先将整个XML文档加载到内存中 | DOM方式 |
基于事件驱动 | 根据不同需求事件(检索,修改,删除等)去执行不同解析操作(不需要把整个XML 文档加载到内存中) | SAX方式,PULL方式 |
DOM方式
Document Object Model,即 文件对象模型,是 一种 基于树形结构节点 & 文档驱动 的XML解析方法,它定义了访问 & 操作xml文档元素的方法和接口
DOM解析原理
- 核心思想
基于文档驱动,在解析XML文档前,先将整个XML文档存储到内存中,然后再解析 - 解析过程
- 解析器读入整个XML文档到内存中
- 解析全部文件,并将文件分为独立的元素,属性等,以树结构的形式在内存中表示XML文件
- 然后通过DOM API去遍历XML树,根据需要搜索数据/修改文档
- 具体解析步骤
- 获取DOM解析器工厂实例(DocumentBuilderFactory.newInstance())
- 获取DOM解析器对象,调用解析器工厂实例类的newDocumentBuilder()
- 最后获取代表整个文档的Document对象
具体解析实例
1 | public void domTest(Context context) { |
特点及应用场景
- 优点
- 操作整个XML文档的效率高
- 可随时,多次访问已解析的文档
- 缺点
- 耗内存,时间
应用场景 - 适合XML文档较小,需频繁操作 解析文档,多次访问文档的情况
- 对于移动端,内存资源非常宝贵,使用时需权衡利弊
- 耗内存,时间
SAX方式
即 Simple API for XML,一种 基于事件流驱动、通过接口方法解析 的XML解析方法
SAX解析原理
核心思想
基于事件流驱动,根据不同需求事件(检索,修改,删除等)去执行不同解析操作,不需要把整个XML 文档加载到内存中解析过程
- 按顺序扫描XML文档
- 当扫描到(Document)文档的开始/结束标签,(Element)节点元素的开始/结束标签时,直接调用对应的方法,将状态信息以参数的方式传递到方法中
- 然后根据状态信息去执行相关的自定义操作
具体的操作 - 自定义Handler处理类,继承自DefaultHandler类
- 重写5个核心回调方法
1
2
3
4
5startDocument()
startElement()
characters()
endElement()
endDocument()
具体解析实例
1 | public void saxTest(Context context) throws Exception { |
特点及应用场景
- 优点
- 解析效率高
- 内存占用少
- 缺点
- 解析方法复杂,API接口方法复杂,代码量大
- 可扩展性差,无法修改XML树内容结构
应用场景 - 适合XML文档大,解析性能要求高,不需修改 多次访问解析的情况
PULL方式
一种 基于事件流驱动 的XML解析方法,是Android系统特有的解析方式
PULL解析原理
基于事件流驱动,根据不同需求事件(检索,修改,删除等)去执行不同解析操作,不需要把整个XML 文档加载到内存中
- 解析过程
- 首先按顺序扫描XML文档
- 解析器提供文档的开始/结束(START_DOCUMENT,END_DOCUMENT),元素的开始/结束(START_TAG,END_TAG)
- 当某个元素开始时,通过调用parser.nextText()从XML文档中提取所有字符数据
具体解析实例
1 | public void pullTest(Context context) throws Exception { |
特点及应用场景
- 优点
- 解析效率高
- 内存占用少
- 灵活性高 可控制事件处理结束的时机(与SAX最大的区别)
- 使用比SAX方式简单
- 缺点
- 可扩展性差,无法修改XML树内容结构
应用场景 - 适合XML文档大,解析性能要求高,不需修改 多次访问解析的情况
- Pull使用比SAX更加简单,在Android中推荐使用Pull方式
- 可扩展性差,无法修改XML树内容结构