我的模型元素可能包含多个不同类型的子元素。对于每种类型,只能存在 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”的列表。如果我将两个“log”元素重命名为“logBefore”和“logAfter”,每个元素都有自己的属性,所以很明显问题是 JAXB 无法区分这两个“log”。
我知道 XSD 本身并不是很精确:它允许“log”类型的单个子元素,在这种情况下,如果将其视为“之前”或“之后”元素,则它是未定义的。在我当前的(手动编写的)阅读器类中,我有明确的代码来检测这种情况并将单个“log”元素解释为“before”元素。
我正在寻找一种方法来告诉 JAXB 通过 xjb 映射或可能使用更具体的 XSD 以不同方式处理两个“日志”元素。