获取XML配置数据
1 详细功能
1.1 详细功能
为了实现theme的即配即用,规定theme的配置使用xml文件,框架的配置和模块的配置的provider都可以由用户指定,可以在运行时传入框架配置的provider,然后在 框架配置里面指定了模块配置的provider。
因此本章讲述获取默认的xml方式配置的数据。
1.2 功能边界
只是负责配置文件为xml时候的读取、解析并获取xml中的配置数据。其实就是实现前面桥接模式的抽象部分的接口。
2 内部实现
2.1 加入解释器模式
2.1.1面临的问题
自己解析xml,本来也没有什么特别困难的,但是问题就在于,如果xml文件的格式发生了变化,那么读取配置文件的程序就需要做出相应的变更,严重的时候,几乎相当于完全重写程序。
那么怎么解决当xml的结构发生改变过后,能够很方便的获取相应元素、或者是属性的值,而不用再去修改解析xml的程序呢?
2.1.2用解释器模式来解决
1)模式定义:
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2)模式本质:
解释器模式的本质:分离实现,解释执行。
3)基础知识:
(1)解释器模式使用解释器对象来表示和处理相应的语法规则,一般一个解释器处理一条语法规则。
(2)解释器模式没有定义谁来构建抽象语法树,把这个工作交给了客户端处理
(3)使用解释器模式的时候,应该先定义好相应的语法规则,并根据规则制定解释器的语法树;然后客户端在调用解释器进行解释操作的时候,需要自行构建符合语法规则要求的语法树;而解释器模式只是负责解释并执行。
(4)从实质上看,解释器模式的思路仍然是分离、封装、简化,跟很多模式是一样的。
4)常见应用场景:
语法较为简单的自定义表达式解析,比如自定义xml文档的解析,文档结构不要太复杂,那不适合使用解释器模式。
解释器模式的基本实现,沿用了《研磨设计模式》一书的解释器模式一章中最后实现的通用解析程序,由于篇幅关系,这里就不会那么详细的讲述实现的细节,这里更关心实现的思路,比较高层一点。因此更多的细节请查看源代码或是《研磨设计模式》一书的解释器模式一章的内容。
很明显,使用解释器模式来解决这个问题是一个很好的思路。
设计一个简单的表达式规则,然后通过解释器模式来进行解析执行,从而获取到xml中的值。
约定简单的语法规则如下:
1:为表达式设计简单的文法
为了通用,用root表示根元素,a、b、c、d等来代表元素,一个简单的xml如下:
Ø获取单个元素的值:从根元素开始,一直到想要获取值的元素,元素中间用“/”分隔,根元素前不加“/”。比如表达式“root/a/b/c”就表示获取根元素下、a元素下、b元素下的c元素的值
Ø获取单个元素的属性的值:要获取值的属性一定是表达式的最后一个元素的属性,在最后一个元素后面添加“.”然后再加上属性的名称。比如表达式“root/a/b/c.name”就表示获取根元素下、a元素下、b元素下、c元素的name属性的值
Ø获取相同元素名称的值,当然是多个:要获取值的元素一定是表达式的最后一个元素,在最后一个元素后面添加“ ” 。 比 如 表 达 式 “ r o o t / a / b / d ”。比如表达式“root/a/b/d ”。比如表达式“root/a/b/d”就表示获取根元素下、a元素下、b元素下的多个d元素的值的集合
Ø获取相