Мой элемент модели может содержать несколько дочерних элементов разных типов. Для каждого типа может присутствовать только 0 или 1 дочерний элемент. Порядок этих элементов определен, т. е. все элементы типа A предшествуют B и т. д. Мой класс модели, сгенерированный JAXB, поэтому должен иметь отдельное свойство getter/setter для каждого типа дочернего элемента.
Что усложняет ситуацию, так это одно исключение из приведенного выше правила: в начале и ближе к концу списка дочерних элементов может появиться 0 или 1 элемент типа X, и оба эти элемента имеют одно и то же имя.
Вот немного упрощенная версия моего текущего типа XSD из реальной жизни:
<xs:complexType name="Activity">
<xs:sequence>
<xs:element name="log" type="DiagnosticLogMessage" minOccurs="0" maxOccurs="1" />
<xs:element name="inputs" type="Mappings" minOccurs="0" maxOccurs="1" />
<xs:element name="outputs" type="Mappings" minOccurs="0" maxOccurs="1" />
<xs:element name="log" type="DiagnosticLogMessage" minOccurs="0" maxOccurs="1" />
<xs:element name="to" type="DirectConnection" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
"журнал" - проблемный элемент. С приведенным выше определением типа "to" правильно получает свое собственное свойство, но остальные элементы попадают в список с именем "logsAndInputsAndOutputs". Если я переименую два элемента «журнала» в «logBefore» и «logAfter», каждый элемент получит свое собственное свойство, поэтому очевидно, что проблема в том, что JAXB не может различать два «журнала».
Я понимаю, что сам XSD не совсем точен: он допускает один дочерний элемент типа «журнал», и в этом случае он не определен, следует ли считать его элементом «до» или «после». В моем текущем (написанном вручную) классе чтения у меня есть явный код для обнаружения этого случая и интерпретации одного элемента «журнала» как элемента «до».
Я ищу способ сообщить JAXB по-разному относиться к двум элементам журнала, либо с помощью сопоставлений xjb, либо, возможно, с более конкретным XSD.