问题
JAXB是我用过的java处理XML的方法中做方便的一个,在jaxb中如何使用类的集成关系有一个小小的需要注意的地方。看下面的两端XML。
XML 示例1:
<a> <b></b> <c></c> <a>
XML示例2:
<a> <b></b> <d></d> <a>
这两段XML的唯一差别就在c元素与d元素。为了生成这两个XML,有几种方案。
方案一
不利用类的继承来重用代码,写两套Java代码, 如:
@XmlRootElement(name = a) public class A { B b; C c: } @XmlRootElement(name = a) public class A2 { B b; D d: } public class B {} public class D {}
这一方案不是我们想要的,虽然可以解决问题,但是不能重用两个XML中共有的结构。
方案二
利用一个父类表示两个XML之间的共同的结构,用两个子类扩展这个父类,分别添加 C 和 D 元素。
代码如下:
@XmlRootElement(name = "a") public class A { B b; } public class B {} public class C {} public class D {} public class E extends A { C c; } public class F extends A { D d; }
这一方案看似很直观,但是实践中却发现 E 和 F 却都只能生成 父类的 部分,如下的XML:
<a> <b></b> <a>
即使把 @XmlRootElement(name = “a”) 移到 E 和 F类上也行不通。
方案三
用一个类代表共同的结构,用一个父类代表C和D元素,在用两个类代表具体化的C和D类,如:
@XmlRootEelemnt(name = "a") public class A { B b; @XmlElements({ @XmlElement(name = "c", type=C.class), @XmlElement(name = "d", type=D.class) }) E e; } public class B {} public class E {} public class C extends E {} public class D extends E {}
这样做才最终达到目的。关键点就是@XmlElements的使用。