XSD具有相同内部结构的两个元素

XSD具有相同内部结构的两个元素,xsd,xml-serialization,xml-deserialization,Xsd,Xml Serialization,Xml Deserialization,我正在使用xsd,试图让它验证xml xml用于创建对象。列表中的元素可以创建两种类型的对象:SC和SMSC。SMSC是一个SC,并对其进行了扩展 SMSC不包含任何新属性。从xml的角度来看,SMSC在各个方面都与SC相同,只是定义其属性的元素由标记而不是标记包装 我们的XSD如下所示: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name='Definitions'>

我正在使用xsd,试图让它验证xml

xml用于创建对象。列表中的元素可以创建两种类型的对象:SC和SMSC。SMSC是一个SC,并对其进行了扩展

SMSC不包含任何新属性。从xml的角度来看,SMSC在各个方面都与SC相同,只是定义其属性的元素由
标记而不是
标记包装

我们的XSD如下所示:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name='Definitions'>
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element maxOccurs="unbounded" name="SC">
          <!--SNIP properties of SC and SMSC -->
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

除了复制SMSC元素中的所有属性定义外,是否有其他方法可以更改它以允许SC或SMSC作为元素?我们不希望文档的长度增加一倍,并复制所有属性定义


目前,XML中唯一的验证错误是有SMSC元素的地方。如果没有办法在不复制所有属性定义的情况下解决此问题,我们将保持原样,但如果可行,我们显然更愿意消除此引发的警告。

虽然标签而不是标签会混淆
,但我认为下面的说明要么回答了您的问题,要么会引出更好的解释

所以,你看到的是避免重复;实际上,您不需要额外的类型SMSC(请参见Definitions2),但我只是以防万一(Definitions)。使SC类型的SMSC元素的工作原理完全相同

定义/定义2定义3之间的区别在于使用替代组而不是选择。我个人更喜欢替代组而不是选择,但遇到与替代组相关的问题并不少见(即,它们在这里和那里都得不到很好的支持)


虽然标签而不是标签会让人混淆
,但我认为下面要么回答了您的问题,要么给出了更好的解释

所以,你看到的是避免重复;实际上,您不需要额外的类型SMSC(请参见Definitions2),但我只是以防万一(Definitions)。使SC类型的SMSC元素的工作原理完全相同

定义/定义2定义3之间的区别在于使用替代组而不是选择。我个人更喜欢替代组而不是选择,但遇到与替代组相关的问题并不少见(即,它们在这里和那里都得不到很好的支持)



这很有效,谢谢!我没有意识到您可以定义新的复杂类型并在这样的定义中使用它们。你每天都能学到新东西!(顺便说一句,第一个版本正在为我们工作)这个工作,谢谢!我没有意识到您可以定义新的复杂类型并在这样的定义中使用它们。你每天都能学到新东西!(顺便说一句,第一个版本正在为我们工作)
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:complexType name="SC">
        <xsd:sequence>
            <!-- Stuff goes here -->
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="SMSC">
        <xsd:complexContent>
            <xsd:extension base="SC"/>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element name="Definitions">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="SC" type="SC"/>
                <xsd:element name="SMSC" type="SMSC"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
    <!-- Another way -->
    <xsd:element name="Definitions2">
        <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="SC" type="SC"/>
                <xsd:element name="SMSC" type="SC"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Definitions3">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="SC" maxOccurs="unbounded"/>               
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="SC" type="SC" />                 
    <xsd:element name="SMSC" type="SMSC" substitutionGroup="SC" />              
</xsd:schema>