XSD - 嵌套在具有相同名称的元素中的元素 - 是否合适?

Mic*_*ski 3 xml xsd jaxb xjc

主题中的问题:在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>
Run Code Online (Sandbox Code Playgroud)

如果是这样,你如何使xjc正确生成类?我得到了类似静态类的编译错误TypeOfAction(基本上我会得到两个生成相同名称的嵌套静态类).

Daw*_*tel 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> 
Run Code Online (Sandbox Code Playgroud)

但它不能编译,因为Java不允许声明与外部类同名的内部类.尝试使用xjc绑定或内联架构注释更改生成的类型名称.你可以在这里找到例子.

内联绑定示例:

...
<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>
...
Run Code Online (Sandbox Code Playgroud)