关于问题b
XML树:JDOM, dom4j等都可以直接找到父子关系
BEAN体系:
I.原子属性。我们限定一个BEAN中所有有业务意义的原子字段的类型都STRING,所有String类型的字段都是业务字段
II.单个子结点。我们让所有有业务意义的非原子字段都实现一个共同的接口BusiNode,这样一个BEAN中所有BusiNode成员都是这个BEAN的子结点
III.类集子结点。我们也可以限定所有且只有类集子结点可以使用List或Set类型,这样可以利用过滤出所有类集子结点。然而,在JAVA1.4及以前的版本里,程序并不知道过滤出的类集子结点是哪个Class的实例(因为没有泛型),也就没办法实例化一个类集子结点(见后文),因此只能手动注册类集子结点的属性名和Class。JAVA1.5以上的版本我没用过,不知道可不可以解决这个问题。
数据库表关系: 这就不用多说了,就是通过外键参考。因此每类结点对应的表中,都必须有个外键,以参考它的父结点;还必须有个主键,以供它的子结点参考。各表的外键名必须相同并为一常数,否则程序生成INSERT SQL时才可以不用理会具体表的具体的外键名。
程序在解析时,遍历的是BEAN树;在持久化时也是。比起XML树,BEAN树代表真正的业务结构;比起数据库表关系树,BEAN树才能由父至子地进行先序遍历
4.其他问题
a.要让程序知道,原子属性中哪些是XML结点的属性,哪些是XML结点的原子ELEMENT。代码中这是两个抽象方法,必须让具体的结点类实现
b.回顾本文概述部分提到的“pig --content --pighead 的三级关系,无端端多了一个content结点”,因此我们要让程序知道,pighead,pigfoot等结点的子结点,究竟是pig,还是pig下的content。处理不规范XML时要注意这个问题。这也是一个抽象方法,必须让具体的结点类实现
c.与上一条类似但更变态的,是类集结点的不规范问题。假设一个pig有多个pighead,那结构可能为 pig--pighead,pighead,...,也可能为pig--pigheads--content,content.... 必须让程序知道某个具体结点用的是哪种模式
5.代码
核心:多态 + 递归
a.接口BusiNode
|
b.默认的实现