使用具有多个模式的JAXB解析Xml,每个模式位于单独的maven模块中

时间:2013-09-28 22:06:12

标签: java maven jaxb jaxb2 maven-jaxb2-plugin

我目前正致力于让Maven JAXB插件为一组非常复杂的Xml架构生成模型。我开始使用一个Maven模块中的所有模式。生成的模块能够解析该语言的任何文档。不幸的是,由于我需要在另一个模块中导入该模式和模型,我不得不将这个模块拆分成几个模块。在多模式模块的情况下,似乎存在与剧集文件有关的问题。

现在举例来说,我有一个模式定义了xml格式的一般结构,并定义了基本类型(让我们称之为A)。现在有几个其他模式,每个模式实现这些基类型的子类型(让我们调用其中一个B)。

我创建了模块,所以B扩展了A.不幸的是现在看来我再也无法解析文档了。我可以看到,在模块B中,已经创建了一个用于A的ObjctFactory,其中仅包含B从A中排出的所有类型的定义。所有其他类型都不再存在。

只要存在此ObjectFactory,我就无法解析任何内容,因为缺少根元素的定义。如果我删除它,结果对象树中缺少B中定义的所有元素。

将模块中的原始ObjectFactory与所有模式进行比较后,我可以看到在第一个版本中有大量的“替代品”,它们告诉解析器哪些元素可能来。在拆分版本中,这些都丢失了,所以我想如果我删除B中的部分ObjectFactory,则使用A中的一个,而且这个不知道B中的元素。

那么我怎样才能让JAXB解析A和B中的所有语言。有没有办法扩展ObjectFactories?如果是的话,这是怎么做到的?

我想下一件可能造成麻烦的事情可能是我有几个扩展A的模式所以我有包含A,B,C,D和E的文档,其中B,C,D和E都扩展A但是完全相互不相容。在这种情况下,我觉得延伸不是一个选择。

1 个答案:

答案 0 :(得分:0)

在执行OGC Schemas and Tools Project时,我经常遇到这种情况。这个项目有很多模式相互使用。

以下是一些提示:

  • 将单个模式分成单独的Maven模块。一个架构 - 一个罐子。
  • 生成剧集文件。
  • 使用这些剧集和separate schema compilation来避免为导入的架构生成类。
  • 不过,XJC会在这里和那里为导入的模式生成内容 - 即使你的剧集文件说你不需要任何东西。大多数情况下,这些东西都可以被删除。我在构建期间使用Ant插件删除这些文件。
  • 在运行时中,您只需包含所需的所有JAR,并为上下文路径构建JAXB上下文com.acme.foo:com.acme.bar

您可能想查看我提到的OGC project。该项目有大量相互关联的模式,具有不同的共存版本。