Android XML Parser

上篇我们讲解了如何使用 Kotlin 来写 XML parser ,我们也有提到 DOM parser 有个缺点就是有可能会消耗较多的记忆体,这点在 mobile 平台其实要特别注意,尤其是 Android 系统,Android 的装置很多,我们没办法保证手机的记忆体一定很大。在写 Android APP 的时候,希望能够尽可能地省记忆体。那之前介绍的 DOM parser 在 Android 上不见得是很好的做法,幸运的是 Android 原生有提供优化过的 XML parser ,我们可以拿这个来当成我们日後 annotation processor 的 parser generator 的基底。

XmlPullParser

这个 parser 其实并不存在 Java 的 standard library ,他是一个 Android 额外纳入的 library ,但他的运作原理其实跟 StAX 一样。

  • Event pulling based 机制。
  • 以 steam 资料流方式载入资料,读到哪,写到哪,依赖节点走访的先後顺序。
  • 与 DOM parser 相比,较省记忆体。
  • 经过实测在 runtime 的时候真的比 DOM parser 快。

XmlPullParser 虽说比较快,也比较省记忆体,但还是有一个缺点:无法直接跨层存取 tag ,必须要一层一层读取。这个对我们在写 parser 的时候,或许会比较不方便,我们可以用暂存的变数先把一层层的参数存起来解决无法跨层存取的问题。

XmlPullParser 在拉 event 的时候是靠 next() 这个方法去达成的,有点像是我们在写 List 的 iterator ,回圈每次去问还有没有下个 element 可以用。在这个 parser 里面有预先定义好一些 event 可以让我们使用:

  • START_DOCUMENT
    • 代表 XML 内容开始的 event 。
  • START_TAG
    • 这个 event 代表一个 tag 的起始 。
  • TEXT
    • 代表文字内容的 event 。
  • END_TAG
    • 这个 event 代表一个 tag 的结束。
  • END_DOCUMENT
    • 代表 XML 内容结束的 event 。

下篇我们将会开始实作 XmlPullParser ,我们可以比较一下它写起来的感觉和 DOM parser 有什麽差别!


<<:  Day 10 CSS <元素显示模式>

>>:  D-20. 预设更改DBMS 、bundle指令 、Gemfile && Reverse String II && III

JavaScript DOM classList

classList ClassList是一个物件,会返回一个 DOMTokenList,里面包含此元...

乔叔教 Elastic - 30 - Elasticsearch 的优化技巧 (4/4) - Shard 的最佳化管理

Elasticsearch 的优化技巧 系列文章索引 (1/4) - Indexing 索引效能优化...

不只懂 Vue 语法:什麽是 Virtual DOM?Vue 如何利用 Virtual DOM?

问题回答 当我们更新资料和渲染画面时会频繁地新增和删除 DOM 元素,造成效能问题。因此,不论是 V...

Ruby on rails - 1

Mac OS 开发系统 完成基本环境设置後 开始新专案 在终端机 Terminal cd 到指定要放...

Day 14 在VSCode中使用Azure

前言 由於接下来要开始写到attention和Capsule的实作,主要是会研究一些github或是...