试用 Android 自有的 XmlResourceParser

有个现成的函数,里面用到了 XmlResourceParser,之前是把它当成黑盒子的,但非常零星然而又持续了很久地,后台的崩溃日志里有记录关联到了这个函数内部。今天抽空整理了一下其中的逻辑,力图把问题消除掉。

其实这个玩意儿实现的路子是随 SAX 的方式来的,就是流水席,顺着文档文本内容的从前到后的顺序把标签和属性源源不断地端上来。当要打开资源中的 XML 进行解析时,调用是这样的:XmlResourceParser xml = resources.getXml(xmlResourceId),如果要解析 AndroidManifest.xml,则是这样,XmlResourceParser parser = resources.getAssets().openXmlResourceParser(“AndroidManifest.xml”)。

梳理过程中发现,原先的实现有考虑不周的情况,对某个节点的解析,需要它是在特定的父节点下,而相应的判断没有跟上。另外,在访问一个标签的属性时,发现用名称访问是无法成功的,而用索引访问则可以。事后发现系统还提供了一个 Android.Util.Xml 的工具类,可以把前文中的 parser 转换为一个属性组的对象,如这样 AttributeSet attributeSet = Xml.asAttributeSet(parser)。

网上有一些人会有如何把 XmlResourceParser 用起来更像传统 XML 解析器的想法,大约就是如何转为 DOM 模型的意思。在 SO 上有个讨论,见这里,https://stackoverflow.com/questions/36176740/get-org-w3c-dom-document-from-xmlresourceparser。其中提到要历经两次封装,第一次就是要把 XmlResourceParser 先裹一层,最小化增加必要的改造以使其可以适配 org.xmlpull.v1.sax2.Driver 的二次封装。

虽然目前用不到,但是作为一个信息收集者,还是找了一份对 XmlResourceParser 浅封装的代码,链接是 https://www.oomake.com/question/4511818,代码如下。

在该文中,对此封装类的使用像这样:

这篇文章虽然是中文的,但看上去说不定就是内容农场直接用工具翻译的 SO 上的另外哪一篇,时间关系,就没再找原始出处,毕竟防丢的主要部分(也就是代码)已经在上面存档了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注