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

时间:2013-03-12 14:15:02

标签: xsd xml-serialization xml-deserialization

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

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

SMSC不包含任何新属性。从xml的角度来看,SMSC在各方面都与SC相同,只是定义其属性的元素由<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>

有没有办法将此更改为允许SC或SMSC作为元素,而不是复制SMSC元素中的所有属性定义?我们不希望将文档的长度加倍并复制所有属性定义。

就目前而言,我们在XML中唯一的验证错误就是我们有一个SMSC元素。如果没有办法解决这个问题而不重复所有的属性定义,我们会保持原样,但是如果可行的话,我们显然更愿意消除这种警告。

1 个答案:

答案 0 :(得分:1)

虽然令人困惑by tags instead of tags,但我认为下面要么回答你的问题,要么引出更好的解释。

所以,你看到的是避免重复;您实际上并不需要其他类型 SMSC (请参阅 Definitions2 ),但我已将其放在以防万一(定义)中。制作 SC 类型的 SMSC 元素将完全相同。

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

<?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>