2012-03-13 38 views
8

问题: 如何让xjc/Jaxb为包含重复的elementdefinitions的几个模式在相同的命名空间中生成propper javaclasses?使用JAXB编译几个包含同一元素的重复定义

信息: 我有三个.xsd模式:A,B和C.都具有相同的目标名空间。 他们都是给我的3种shemas,我不可能以任何方式改变它们。

它们A具有一些元件,其也于B或C中发现(但A具有许多自声明的元素为好) 实施例:这是相同的“代码”为A和C:

<xs:simpleType name="y_ym_ymdDatoType"> 
    <xs:union memberTypes="arcgYearType arcgYearMonthType arcDateType"/> 
</xs:simpleType> 
<xs:simpleType name="arcgYearType"> 
    <xs:restriction base="xs:gYear"> 
     <xs:minInclusive value="1700"/> 
     <xs:maxInclusive value="2100"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcgYearMonthType"> 
    <xs:restriction base="xs:gYearMonth"> 
     <xs:minInclusive value="1700-01"/> 
     <xs:maxInclusive value="2100-12"/> 
    </xs:restriction> 
</xs:simpleType> 
<xs:simpleType name="arcDateType"> 
    <xs:restriction base="xs:date"> 
     <xs:minInclusive value="1700-01-01"/> 
     <xs:maxInclusive value="2100-12-31"/> 
    </xs:restriction> 
</xs:simpleType> 

当使用XJC将它们汇编成javaclasses,我得到下面的异常:

[ERROR] 'y_ym_ymdDatoType' is already defined 
line 297 of file:../c.xsd 

[ERROR] (related to above error) the first definition appears here 
line 309 of file:../a.xsd 

和同样发生在其他元素:arcgYearType,arcgYearMonthType和arcDateType。

我已阅读关于可能可以解决这个问题的绑定文件,但我不知道如何做到这一点,所以示例将是高度优先的。

回答

0

您可以使用绑定文件手动解决冲突。这里是例子,在那里你可以为冲突的名称指定您的自定义名称:

<bindings schemaLocation="../party.xsd" version="1.0" node="/xs:schema"> 
    <bindings node="//xs:complexType[@name='FixedIncomeBook']"> 
     <class name="PartyFixedIncomeBook"/> 
    </bindings> 
</bindings> 
+0

这是不是在它们出来时不会轻易地重命名XML元素,还是只是重命名生成的javaclasses? – 2012-03-13 14:15:28

+0

它重命名生成的java类。默认情况下,你会得到'FixedIncomeBook.java',并且通过这个绑定你可以得到'PartyFixedIncomeBook.java' – 2012-03-13 14:21:11

+0

我得到:[ERROR]不受支持的绑定命名空间“”。也许你的意思是“http://java.sun.com/xml/ns/jaxb/xjc”?文件第4行:/../ C.xsd 第4行是模式定义: 你可以说出了什么问题吗? – 2012-03-13 15:05:10

2

从你的描述,我认为是没有包括XSD文件之间的关系。另外,我必须假设你正在尝试重用类,其中内容重叠。

简单的方法是独立编译每个文件,并为每个XSD文件提供不同的Java包。这里的问题是,如果你试图将内容从一个XML“链接”到另一个XML(即,从A解组,然后从B解组),然后在com.A包中包含C1类,在包com.B中包含C1类,而匹配相同的XSD复杂类型,不是“可互换的”;你将不得不在它们之间进行转换。您需要一个自定义绑定文件,或者如果您使用NetBeans,只需在JAXB向导中设置不同的包。

最好的方法可能是使用剧集(请参阅this on SO)。处理A.xsd,然后使用该插曲处理B.xsd等。

+0

1.不包含。 2.是的,我想重复使用,因为它们是相同的,但这不是主要目标,所以如果做其他事情更容易,那就这样做吧。 我对C.xsd中的A.xsd没有兴趣,我只是在同一个项目中使用它们。即使xsd来自同一TNS,是否有一种简单的方法可以使软件包延期? – 2012-03-13 14:17:02

+0

@Sofus,那么你为什么不使用剧集?或者使用针对不同命名空间的自定义绑定针对每个包运行xjc? – 2012-03-13 15:48:14

+0

我会在20个小时左右试试,谢谢你 – 2012-03-13 16:37:03

相关问题