通过简化的XSD进行以下操作:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="com.acme" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Widget">
<xs:complexType>
<xs:sequence>
<xs:element
minOccurs="0" name="color" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="WidgetColor" type="xs:string" />
</xs:schema>
然后,尝试以下方法:
xjc test.xsd
你应该总是得到以下例外:
parsing a schema...
compiling a schema...
[ERROR] Two declarations cause a collision in the ObjectFactory class.
line 11 of file:/C:/test.xsd
[ERROR] (Related to above error) This is the other declaration.
line 7 of file:/C:/test.xsd
Failed to produce code.
请注意,元素名称“小部件”是一个complexType,其元素名为“颜色”。还有与“ Widget ”元素相同的级别,一个名为“ WidgetColor ”的简单元素。
更令人费解的是,如果您删除属性minOccurs =“0” 或 ,您删除 xjc来自“color”元素序列的属性nillable =“true”,成功编译了模式。
有没有人见过这个问题或建议解决方案?
谢谢,
麦克
答案 0 :(得分:7)
好吧,我终于想出了如何解决我的问题。它在于使用自定义绑定为其中一个声明指定不同的类名。
custom-binding.xjb的内容
<?xml version="1.0" encoding="UTF-8"?>
<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<bindings schemaLocation="test.xsd">
<bindings node="//xs:element[@name='WidgetColor']">
<class name="BaseWidgetColor" />
</bindings>
</bindings>
</bindings>
操作:
C:\>xjc -b custom-binding.xjb test.xsd
parsing a schema...
compiling a schema...
acme\com\BaseWidgetColor.java
acme\com\ObjectFactory.java
acme\com\Widget.java
acme\com\package-info.java
Patience et longueur de temps valent mieux que rage et acharnement ...!