jaxb: xsd 到 java,一个父元素,可以有另外两个元素之一

jaxb: xsd to java, a parent element that can have one of two other elements

我有一个名为 MESSAGE 的父元素。 MESSAGE 元素可以携带任何类型的 OBJECT (通常是复杂类型),但一次只能携带一个对象。我从 XML 文件开始到 XSD 然后到 java 像这样:

<xs:element name="MESSAGE">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="OBJECT"/>
            <xs:complexType>
              <xs:sequence>
              <!-- Definition here -->
              </xs:sequence>
        </xs:sequence>
      </xs:complexType>
</xs:element>

我有很多 XML 文件,它们具有 MESSAGE 类型但包含不同的 OBJECT。我已经生成了它们的等效 XSDs,但只有第一个使用 xjc 转换为 java,而其余的不是因为错误 Message is already defined。那么我如何才能在我的 XSD 中拥有通用 MESSAGE 元素,它可以接受任何 OBJECTs?

我曾经问过一个与此类似的问题,我认为它会让您了解如何执行此操作:

How to Override Xsd element inside of parent/extended element

您必须 extend/restrict 您的根父对象。

如果 MESSAGE 中的元素必须是已定义元素的子集之一,请使用 <choice>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="MESSAGE">
    <xsd:complexType>
      <xsd:choice>
        <xsd:element name="A" type="xsd:string"/>
        <xsd:element name="B" type="xsd:string"/>
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

如果MESSAGE里面的元素可以是任何定义的元素,使用<any>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="MESSAGE">
    <xsd:complexType>
      <xsd:sequence>
        <any namespace="##targetNamespace"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="X" type="xsd:string"/>
  <xsd:element name="Y" type="xsd:string"/>
</xsd:schema>

我用 minoccursmaxoccurs 解决了这个问题。 但它并不完全符合我的要求。接受的答案更好

<xs:element name="MESSAGE">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="A" minOccurs="0" maxOccurs="1"/>
        <xs:complexType>
          <xs:sequence>
          <!-- Definition here -->
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="B" minOccurs="0" maxOccurs="1"/>
        <xs:complexType>
          <xs:sequence>
          <!-- Definition here -->
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

将所有元素添加到一个 xsd 文件有点麻烦,但它有效,我已经测试过了。 @Andreas 答案似乎使用 <xsd:choice> 更具可读性。我从未使用过它,但我会研究它。