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

时间:2015-08-18 05:57:34

标签: java xml xsd jaxb

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

<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。我已经生成了他们的等效XSD,但只有第一个使用xjc转换为java,而其余的则不是因为错误Message is already defined。那么如何在XSD中使用通用MESSAGE元素,可以使用OBJECT个?

3 个答案:

答案 0 :(得分:1)

我曾经向这个问过一次类似的问题,我想它会让你知道如何做到这一点:

How to Override Xsd element inside of parent/extended element

您必须扩展/限制您的根父对象。

答案 1 :(得分:1)

如果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>

答案 2 :(得分:0)

我使用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文件有点麻烦,但它有效,我已经测试过了。使用<xsd:choice> @Andreas答案似乎更具可读性。我从未使用它,但我会调查它。