我有以下xsd(我只在这里发布相关部分,但命令也是针对此摘录运行的)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="OptionType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="value" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="ControllableType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:float" name="value" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
我对它运行以下命令:
xjc src/main/resources/session.xsd -p org.myorg.mypackage -d src/main/java/org/myorg/mypackage
我收到以下错误:
[ERROR] Property "Value" is already defined. Use <jaxb:property> to resolve this conflict.
line 39 of jar:file:/usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar!/com/sun/xml/internal/xsom/impl/parser/datatypes.xsd
[ERROR] The following location is relevant to the above error
line 14 of file:/home/user/project/src/main/resources/session.xsd
[ERROR] Property "Value" is already defined. Use <jaxb:property> to resolve this conflict.
line 39 of jar:file:/usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar!/com/sun/xml/internal/xsom/impl/parser/datatypes.xsd
[ERROR] The following location is relevant to the above error
line 7 of file:/home/user/project/src/main/resources/session.xsd
Failed to parse a schema.
我在这里阅读了有关绑定的内容:
Symbol is already defined. Use JAXB property to resolve the conflict
JAXB Compiling Issue - [ERROR] Property "Any" is already defined
但为什么这甚至需要呢? XML元素名称与属性名称相结合,属性是否完全限定且唯一?
类似于“OptionType.value”或“ControllableType.value”
答案 0 :(得分:3)
问题在于您的复杂类型包含简单内容和属性value
:
<xs:complexType name="ControllableType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:float" name="value" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
这将允许像
这样的东西<somelement value="1.5">one and a half</somelement>
XJC尝试创建两个属性:
value
,默认情况下,第一个属性名为value
,因为这是属性的名称。
默认情况下,第二个属性名为value
,因为这是简单内容属性的默认名称。
这会让你发生碰撞。
答案 1 :(得分:1)
看起来你正在尝试扩展java.lang.String。但由于String类已包含&#34;值&#34;您不能在您的子课程中使用该属性.-
我想可以忽略String类是final的,因此无法扩展。当您重命名&#34;值&#34;属性你将看到xjc将起作用,但它仍然不会在生成的代码中扩展String(因为它不可能),但是xjc显然仍然会检查你的属性名是否有效导致问题。
@lexicore在评论中解释了为什么这个假设是错误的:
编辑考虑lexicores评论
因此,您可以选择重命名&#34;值&#34;。检查@lexicores答案是否原因。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="OptionType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="my_value" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="ControllableType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:float" name="my_value" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
或不在xs:simpleContent中使用xs:扩展名。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="OptionType">
<xs:attribute type="xs:string" name="name" use="optional"/>
<xs:attribute type="xs:string" name="value" use="optional"/>
</xs:complexType>
<xs:complexType name="ControllableType">
<xs:attribute type="xs:float" name="value" use="optional"/>
</xs:complexType>