xsd - 为什么扩展只能放在 simpleContent 和 complexContent 容器中?

标签 xsd

我很难理解在 XSD 中定义类型扩展和限制的格式的一些细微差别。根据W3Schools reference :

  • simpleContent将“对纯文本复杂类型或简单类型的扩展或限制定义为内容并且不包含任何元素”
  • complexContent定义“仅包含混合内容或元素的复杂类型的扩展或限制

  • 我不清楚的是为什么 XSD 需要在这些容器之一中包含扩展和限制,此外,为什么 只有扩展和限制需要它。如果所有“内容”都必须在容器中定义,那对我来说更有意义,但事实并非如此 - 对于基本类型,内容( sequence 等)被定义为complexType容器。

    this example ,对我来说似乎过于冗长:

    <xs:complexType name="fullpersoninfo">
      <xs:complexContent>
        <xs:extension base="personinfo">
          <xs:sequence>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
    

    为什么不能这样写呢?

    <xs:complexType name="fullpersoninfo">
      <xs:extension base="personinfo">
        <xs:sequence>
          <xs:element name="address" type="xs:string"/>
          <xs:element name="city" type="xs:string"/>
          <xs:element name="country" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexType>
    

    或者甚至像这样?

    <xs:complexType name="fullpersoninfo" extends="personinfo">
      <xs:sequence>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="city" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    

    我假设一定有某种原因将它定义为它的方式,但我找不到任何关于原因的线索。

    最佳答案

    我认为您不会为复杂类型的 XML 语法找到任何有用的设计原理。可以说,设计 XML 语法的人通过您提到的元素设法解决了一些技术难题,并且没有明显更好的语法在工作组中取得共识。您可能想知道 simpleContent 和 complexContent 解决了哪些技术难题,这是一个合理的问题,但我怀疑有人愿意深入研究 XSD 的设计记录,以便回答它。

    一个简单的观察:扩展和限制的合法子级取决于父级是 simpleContent 还是 complexContent。这是使用 simpleContent 和 complexContent 类型的本地声明完成的,没有它们是不可能的——至少,如果没有对 XML 语法进行非常彻底的重新设计,就不可能。

    关于xsd - 为什么扩展只能放在 simpleContent 和 complexContent 容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16819420/

    相关文章:

    xml - XSD 元素与元素不一致

    c# - 使用 XML 命名空间在 C# 中针对模式创建和验证 XML

    xsd - 在哪里可以找到 Office 2007/2010/2013 Open XML 架构

    java - XSD 多态性不适用于 JAXP?

    java - 如何将 EXIF 元中找到的日期时间转换为 XSD 标准?

    javascript - 如何使用 jQuery 对带有命名空间的 XML 进行解析

    xml - 如何覆盖父/扩展元素内的 Xsd 元素

    java - 针对从 WSDL 中提取的多个模式验证 XML

    wcf - 如何将复杂类型嵌入到 wsdl 定义中?

    validation - 在没有 ValidationEventHandler 的情况下根据架构验证 XDocument(用于 HTTP 处理程序)