2010-03-20 102 views
8

我有一个现有的数据模型。我想用XML来表达这个数据模型。JAXB - 将XSD或XSD豆类化为豆?

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

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

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

我倾向于先从XSD开始,但似乎很奇怪,我必须编写和维护一个单独的映射类,以便在我的世界和JAXB世界之间穿梭数据。

有什么建议吗?

回答

6

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

不过认为除非你知道JAXB,否则注释你自己的类的方法可能会变得非常令人沮丧(在痛苦和时间:))。

当我尝试从JAXB生成的类中手动提取超类,然后将实例编组为XML时,发生在相关上下文中的这种情况。我遇到了各种(神秘的)JAXB异常。诚然,我的JAXB知识还没有那么深。

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

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

使用其他技术从未注释的类生成XSD作为XSD上的kick start可能会有帮助。或者你可以选择一个涵盖大部分类的使用的XSD。

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

我们使用HyperJAXB生成基于一组XSD的持久层。生成的类也用于编组。我们有充足的“乐趣”使得这个工作尤其重要。因为IDREF和JAXBElement。

1

您可以使用xjc,并且仍然只有一个具有将作为数据对象服务的XML注释的类。但是,如果你没有重新生成每个构建的类,那就是这种情况。

而在我看来,代码生成的问题是从哪里开始,我建议从类开始。因为如果你有类作为起点,你将永远不需要重新生成这些类。随着时间的推移,你的课程开始增长 - 包括@XmlTransient,继承,辅助方法和其他(JPA)注释。

1

你几乎处于JAXB最糟糕的起点。在你的位置上,我认为JiBX可能是一个更好的选择,它可以从未注释的类模型生成模式,然后在运行时将XML绑定回对象模型,而不使用注释。

+0

JAXB 2在设计时考虑到了这种情况。如果你想表达没有注释的映射,你可以使用EclipseLink MOXy等JAXB实现。 – 2010-07-09 14:03:45

1

我们已经使用的解决方案是拥有一个单独的项目,该项目包含由使用JAXB从中派生java类的xml模式定义的所有数据模型。其他使用数据模型的项目依赖于这个模式包。

通过这种方式,项目之间的所有“契约”都在一个地方定义,使用漂亮的便携式xsd表示法。不需要任何映射类,因为我们直接使用JAXB生成的类。

2

字里行间,我认为符合下列条件:

  1. 你有你想要的对象模型。
  2. 您有所需的XML模式,或者至少有一个相当不错的想法,您希望它看起来如何。

这种情况通常被称为“满足中间”映射。它只是部分由JAXB解决。幸运的是,由于JAXB是一个规范,所以还可以使用其他实现,例如EclipseLink JAXB(MOXy)。

莫西提供了一个基于XPath映射扩展,它可以让你对你有你想要的Java模型和XML模式之间的映射: