XSD - элемент, вложенный в элемент с таким же именем - это правильно?

вопрос как в теме: допустимо ли определять элемент, вложенный в одноименный элемент в 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 уже определен (в основном я получил бы два вложенных статических класса с одинаковым именем).


person Michal Pasinski    schedule 27.12.2012    source источник


Ответы (1)


Фрагмент в порядке. Только глобальные элементы должны иметь уникальное полное имя (комбинация пространства имен и локального имени).

XJC из JDK 7 отлично работает с вашим фрагментом. Мой образец 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 или аннотации встроенной схемы. Вы можете найти пример здесь.

Пример встроенной привязки:

...
<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>
...
person Dawid Pytel    schedule 27.12.2012
comment
Спасибо за усилия, которые вы приложили к этому. Это определенно решает мою проблему - person Michal Pasinski; 28.12.2012
comment
Большое спасибо за ответ! - person Salem Artin; 30.10.2015