到目前为止,我发现使用SAX解析XML的最好方法是在相关的回调中使用堆栈和条件语句。这是一篇描述它的文章,以及我的摘要:
基本前提是,在解析文档时,您将创建对象来存储已解析的数据,然后将它们推入堆栈中,在堆栈顶部偷看以将数据添加到当前元素,并在每个元素的末尾元素将其弹出堆栈并将其存储在父级中。
效果是先解析元素树的深度,然后在每个分支的末尾将其回滚到父级,直到剩下一个包含所有已解析数据的对象(例如ConnectionList)要使用的。本质上,您最终得到了一系列反映原始XML结构的对象
这意味着您需要一些数据对象,这些对象可以以与XML相同的结构存储数据。复杂元素通常将成为类,而简单元素通常将成为类中的属性。根元素通常由某种列表表示。
首先,创建一个堆栈对象以在解析数据时保存数据。
然后,在每个元素的开头,使用
localName.equals()方法确定其类型,创建适当类的实例,然后将其推入堆栈。如果该元素是一个简单元素,则可能会将其建模为表示父元素的类中的一个属性,并且您将需要一系列标志,以告知解析器是否遇到此类元素以及它是什么元素。在该
characters()方法中进行处理。
使用该
characters()方法读取实际数据,然后再次使用条件逻辑基于标志的值确定如何处理数据。本质上,您可以窥视栈顶,并使用适当的方法将数据写入对象,并在必要时从文本转换。
在每个元素的末尾,您会弹出堆栈的顶部,并
localName.equals()再次使用它来确定如何将其存储在对象之前(例如,需要调用哪个setter方法)
到达文档末尾时,您应该已经捕获了文档中的所有数据。



