我一直在尝试使用 JAXB-RI,它是 xjc 来为我的 XSD 生成类(当我说我的 XSD 时,我的意思是非常糟糕的 XSD。稍后会详细介绍)。
我遇到的第一个问题是,我在整个设置中只有两个命名空间。尽管如此,同样的东西在单独的文件中被定义了多次,名称略有不同,但在 XSD 中没有任何区别。例如,我可以有两个 XSD
bar_v01_00.xsd
<xsd:schema xmlns="http://www.foo.com/" targetNamespace="http://www.foo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="foo">
<xsd:complexType>
<xsd:complexContent>
<xsd:element name="elem1" type="xsd:string" />
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
bar_v02_00.xsd
<xsd:schema xmlns="http://www.foo.com/" targetNamespace="http://www.foo.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="foo">
<xsd:complexType>
<xsd:complexContent>
<xsd:element name="elem1" type="xsd:string" />
<xsd:element name="elem2" type="xsd:string" />
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
所以,相同的名称,相同的命名空间,只是不同的文件。我通过指定两个不同的包来解决这个问题,所以 bar_v01_00.xsd 会进入
package www.foo.com.bar.Major01.Minor00;
bar_v02_00.xsd 会编译成
package www.foo.com.bar.Major02.Minor00;
可以肯定的是,不优雅,但有效。现在,这些文件可以包含/导入,每个文件本身都可以包含更多的包含/导入,其中一些可以达到 32 级!总的来说,这些包含是有原因的,即它们被多次重复使用。
我拥有超过 120 个服务,每个服务都有一个请求和响应 XSD,并且可能有一半具有上述多个版本。我设法将其重构为总共 636 个文件,这绝非易事。
我不想将 300 个相同的常见事物的副本生成到单独的包中,所以我尝试使用 .episode 文件。这行得通,但仅限于 3 个深度的包含级别。如果我尝试包含超过 3 个 .episodes,xjc 就会死掉。我尝试将剧集放入 jar 文件中,然后意识到它只会以这种方式查找一集。如果我尝试将剧集的内容合并到一个文件中,它也不起作用。
有什么我能做的,还是我被困在这里?