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
元素,它可以接受任何 OBJECT
s?
我曾经问过一个与此类似的问题,我认为它会让您了解如何执行此操作:
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>
我用 minoccurs
和 maxoccurs
解决了这个问题。 但它并不完全符合我的要求。接受的答案更好
<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>
更具可读性。我从未使用过它,但我会研究它。
我有一个名为 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
元素,它可以接受任何 OBJECT
s?
我曾经问过一个与此类似的问题,我认为它会让您了解如何执行此操作:
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>
我用 minoccurs
和 maxoccurs
解决了这个问题。 但它并不完全符合我的要求。接受的答案更好
<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>
更具可读性。我从未使用过它,但我会研究它。