有时候我们需要用到不定层XML结构来传递参数,比如传递一组由外键关联的表。但是安卓给的正牌xml解析工具xmlpull方式却是逐行读取。肿么办?
以下为解决思路,核心思想是通过堆栈方式读取。
XML结构:
每个元素ObjectX都继承ArrayList<ObjectX>;为了懒省事,我用1,2,3来代替每行的xml开始,/1,/2,/3代替对应的结尾。我太懒了。
1
2/23
4
5/5
/4
/3
/1
6
/6
策略如下:
读取开头时,创建实例,并加入堆栈。
读取结尾时,将堆栈中的最后一项add到倒数第二项的子项,并将最后一项移出堆栈。
当堆栈中无子项时,将实例作为顶层加入输出队列。
OK,我们分步来验证下这种思路正确与否
A:堆栈:1
B:堆栈:1,2
C:堆栈:1,2。第一次发现结尾/2。则2、/2组成的完整xmlelement读取完毕,堆栈将移出2,并将2Add到1的子项。
D:堆栈:1,3
E:堆栈:1,3,4
F:堆栈:1,3,4,5
G:堆栈:1,3,4,5。发现结尾。则最后一项 add到倒数第二项4的子项,并将5移出堆栈。对比XML,5与/5却是是一对,没有配错
H:堆栈:1,3,4。发现结尾。则最后一项 add到倒数第二项3的子项,并将4移出堆栈。对比XML,4与/4却是是一对,没有配错
I:堆栈:1,3。发现结尾。则将最后一项 add到倒数第二项1的子项,并将3移出堆栈。对比XML,3与/3却是是一对,没有配错
J:堆栈:1。发现结尾,则准备将最后一项 add到倒数第二项,但是此时size为1,则1即为一个顶层。应移出堆栈,并列入到输出序列。
K:堆栈:6。
L:堆栈:6。发现结尾,则准备将最后一项 add到倒数第二项,但是此时size为1,则6也为一个顶层。应移出堆栈,并列入到输出序列。
程序结束。这样我们就可以得到一个包含<1 /1> <6 /6>两个复杂结构的序列。
用堆栈的方式来解决好处在于并不需要额外的循环,只需要添加少许判断,不浪费资源。
复杂结构给我们的程序设计带来极大的便利,不必要再给每个“描述的对象”创建特定的类。而用一个通用的支持多层的类即可实现,给整个架构带来更多的柔性。