主题中的问题:在XSD中定义嵌套在同名元素中的元素是否有效?
例如,以下代码段是否正确?
<xs:element name="TypeOfAction" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="TypeOfAction" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
如果是这样,你如何让xjc为其正确生成类?我得到了类似静态类TypeOfAction
的编译错误(基本上我会得到两个同名生成的嵌套静态类)。
答案 0 :(得分:5)
该片段很好。只有全局元素需要具有唯一的限定名称(命名空间和本地名称的组合)。
JDK 7中的XJC与您的代码段完美配合。我的示例XSD生成了正确的类。
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="SomeType">
<xs:sequence>
<xs:element name="TypeOfAction" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="TypeOfAction"
minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code"
type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
但它不能编译,因为Java不允许声明与外部类同名的内部类。尝试使用xjc绑定或内联架构注释更改生成的类型名称。您可以找到示例here。
示例内联绑定:
...
<xs:element name="TypeOfAction"
minOccurs="0">
<xs:complexType>
<xs:annotation>
<xs:appinfo>
<jaxb:class name="InnerTypeOfAction" />
</xs:appinfo>
</xs:annotation>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="code"
type="xs:string" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
...