JAXB - 豆到XSD或XSD到豆?

baj*_*ife 8 java xml xsd jaxb

我有一个现有的数据模型.我想用XML来表达这个数据模型.

如果我要使用JAXB,看起来我有两个选择:

  • 创建一个镜像我的数据模型的XSD,并使用xjc创建绑定对象.编组和解组将涉及创建一个"映射"类,它将获取我现有的数据对象并将它们映射到xjc创建的对象.例如,在我的数据模型中,我有一个Doc类,而JAXB将创建另一个具有基本相同的确切字段的Doc类,并且我必须从我的Doc类映射到xjc的Doc类.
  • 使用JAXB注释注释我现有的数据模型,并使用schemagen从我的注释类生成XSD.

我可以看到两种方法的优点和缺点.似乎大多数使用JAXB的人都是从XSD文件开始的.因为它以真正的跨平台方式表达数据模型,所以XSD应该是黄金标准的真理是有道理的.

我倾向于先从XSD开始,但是我必须编写并维护一个单独的映射类来运行我的世界和JAXB世界之间的数据似乎很蠢.

有什么建议?

fin*_*rod 6

从现有类生成的XSD听起来像是最安全的方式.

然而,除非你很了解JAXB,否则注意你自己的类的方法可能会变得非常令人沮丧(在痛苦和时间:)).

当我尝试从JAXB生成的类中手动提取超类,然后将实例封送到XML时,在相关的上下文中发生了这种情况.我得到了各种(神秘的)JAXB异常.没错,我的JAXB知识还不够深入.

如果你坚持使用JAXB,那么我建议考虑使用第一种方法(XSD + XJC)作为获取类的初始JAXB注释的方法.

您可以使用XSD + XJC来了解如何注释自己的类.然后,您可以尝试将正确的注释放在它们上面.早期从更复杂的类(引用,继承,引用列表,对抽象基类的引用列表)开始.

使用另一种技术从非注释类生成XSD作为XSD的启动可能会有所帮助.或者您可以选择涵盖课程大部分内容的XSD.

如果这项工作的目的是也能够将实例编组为XML,那么我建议关注JAXBElement.在某些情况下(由于缺乏知识,我无法指出)实例不会编组,除非它们被包装在JAXBElement中.

我们使用HyperJAXB基于一组XSD生成持久层.生成的类也用于编组.我们有足够的"乐趣"使这成为特别工作.因为IDREF和JAXBElement.