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