【问题标题】:XSD two elements with the same inner structureXSD 内部结构相同的两个元素
【发布时间】:2013-03-12 14:15:01
【问题描述】:

我正在使用 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>

除了复制 SMSC 元素中的所有属性定义之外,有没有办法改变它以允许 SC 或 SMSC 作为元素?我们不想将文档的长度加倍并复制所有的属性定义。

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

【问题讨论】:

    标签: xsd xml-serialization xml-deserialization


    【解决方案1】:

    虽然by tags instead of tags 令人困惑,但我认为以下内容要么回答了你的问题,要么得到了更好的解释。

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

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

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

    【讨论】:

    • 这行得通,谢谢!我没有意识到您可以定义新的复杂类型并在定义中使用它们。你每天学习新的东西! (顺便说一句,第一个版本现在为我们工作)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2017-08-04
    • 2010-11-21
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多