dom4j & ANTLR visitor模式比较

比较原由

使用过ANTLR自动自成的Visitor后,爱不释手。于是我以为所有visitor都是这样。在解析xml文件时,尝试使用dom4j的Visitor,发现并不好用。为了更清楚地认识这两者有什么不同,我来详细比较。

比较维度

| 模式 | 访问控制权|遍历顺序|访问方法划分标准|父结点是否可取得子结点数据|
|:------|:---:|:---:|:---:|:---:|:---:|
|ANTLR|是|可控深度|按结点名称划分|可以|
|DOM4j|否|深度优先|按xml元素类型划分|不可以|

访问控制权 & 遍历顺序

dom4j对树进行深度优先遍历。访问过程由dom4j完全控制。
ANTLR也采用优先遍历。但是,是否进入一个子树进行遍历,用户具有控制权。只有显式调用visitorChild()才会遍历子方法。

访问方法的划分

dom4j中的每个visit方法分别对应不同的dom元素类型,如element, attribute. Visitor中提供了visitElement(), visitAttribute()等方法。
ANTLR中的方法是根据元素名称生成的。例如:visitHeader(), visitBody(). 因此每个visit方法都具有明确的语义。

父结点是可以取得子结点数据

dom4j的每个visit方法都是 void返回值。 而ANTLR中,由于对子结点的方法是由父结点显示调用方法实现的,因此子结点的可向父结点返回数据。这使得父结点的逻辑处理具有较高的抽象层级。

总结

由于dom4j采取了完全控制遍历的方法,每个visit方法都由dom4j调用。因此,子结点的解析结果不可以直接返回给父结点。父节点无法进行较高抽象层级的编程。

dom4j的方法是按xml语义生成的,对业务逻辑没有提示作用。在element visit方法中,还需要根据结点的id或者名称区别语义,决定如何解析。

推荐阅读更多精彩内容