私のモデル要素には、異なるタイプの複数の子要素が含まれる場合があります。タイプごとに、0 個または 1 個の子要素のみが存在する場合があります。これらの要素の順序は定義されています。つまり、タイプ A のすべての要素が B の前に来るなどです。したがって、JAXB によって生成されたモデル クラスには、子要素のタイプごとに個別の getter/setter プロパティが必要です。
複雑なのは、上記のルールの 1 つの例外です。子要素のリストの先頭と末尾付近に、それぞれタイプ X の 0 個または 1 個の要素が表示される場合があり、これらの要素は両方とも同じ名前を持ちます。
これは、現在の実際の 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」という名前のリストに入ります。2 つの「ログ」要素の名前を「logBefore」と「logAfter」に変更すると、各要素が独自のプロパティを取得するため、JAXB が 2 つの「ログ」を区別できないことは明らかです。
XSD 自体が正確ではないことは理解しています。「log」型の子要素を 1 つ許可します。この場合、これが「前」要素または「後」要素と見なされるかどうかは未定義です。私の現在の (手動で作成された) リーダー クラスには、このケースを検出し、単一の「ログ」要素を「前」要素として解釈するための明示的なコードがあります。
xjb マッピングまたはより具体的な XSD を使用して、2 つの「ログ」要素を異なる方法で処理するように JAXB に指示する方法を探しています。