【问题标题】:XML Schema / Validation Query - Missing ElementsXML 模式/验证查询 - 缺少元素
【发布时间】:2013-10-11 00:38:32
【问题描述】:

如果你有一个 XML 模式,它规定一个元素有一个默认值,然后你有一个遵循该模式的 XML 文件,它完全省略了该元素,它仍然有效吗?

即如果元素丢失,验证器是否只是说元素丢失,所以我们采用架构中定义的默认值并且 XML 有效?

所以可能是这样的:

<xs:element name="test" type="xs:boolean" default="false"/>

那么,一个 XML 文件同时遗漏了 'example' 元素,这有效吗?

我问的原因是因为我已经看到许多带有使用属性的元素的模式:minOccurs="0" 这推断如果这些元素丢失,那么它仍然会验证。我的问题是它是否会验证 minOccurs 是否未指定但指定了默认值?

谢谢。

【问题讨论】:

    标签: xml


    【解决方案1】:

    不,省略没有minOccurs="0" 的元素是无效的——即使在该元素上指定了default

    在 XML Schema 中,元素可以有默认值!大多数人都熟悉属性的默认值(这也是 DTD 中提供的一项功能),但元素的默认值并不常见。

    对于元素,仅当元素存在且为空时才使用默认值。这与属性不存在时使用默认值的属性不同。

    举个例子:

    <xs:element name="foo">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="test" type="xs:boolean" default="false"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    

    以下实例不是架构有效,因为必须有一个test 元素。默认没有区别,因为没有test元素。

    <foo></foo>
    

    以下实例 架构有效且 test 元素采用默认值(在本例中为“false”),因为 test 元素存在且为空。

    <foo><test></test></foo>
    

    注意:如果 XML Schema 没有指定默认值,那么上述两个示例实例显然都不是有效的模式。在第一个示例中,没有 test 元素,而需要恰好其中一个。在第二个示例中,有一个 test 元素,但其内容为空,并且空字符串不是 xs:boolean 的有效值。

    【讨论】:

      【解决方案2】:

      minOccursdefault 指的是两个不同的概念。您的问题需要更多上下文才能完全回答。 minOccurs 是指一个元素可以作为另一个元素的子元素出现的次数。 default 指的是字符串值(有时键入 - 例如这里作为布尔值)。您在元素上使用的defaultinvalid

      这是属性的默认值(来自 w3schools)

      默认为 属性

      属性可能具有指定的默认值。

      默认值是自动 没有时分配给属性 指定了其他值。

      在下面的例子中默认 值为“EN”:

      <xs:attribute name="lang" type="xs:string" default="EN"/>
      

      对于 minOccurs

      <xs:element name="person">  
           <xs:complexType>
               <xs:sequence>
                 <xs:element name="full_name" type="xs:string"/>
                 <xs:element name="child_name" type="xs:string"
                 maxOccurs="10" minOccurs="0"/>
               </xs:sequence>
         </xs:complexType>
       </xs:element>
      

      上面的例子表明 “child_name”元素可以出现 最小的零次和最大的 在“人”元素中出现十次。

      default 引用属性中的字符串值。 minOccurs 表示可以省略元素。

      【讨论】:

      • 好的,非常感谢,所以你不能对元素使用默认值,只能使用属性。我想这就是让我感到困惑的原因。
      • @Jason。对不起! XSD 不直观!值得通过 zvon.org/xxl/XMLSchemaTutorial/Output/series.html 之类的教程来学习
      • 这实际上是不正确的。您可以对元素使用默认值,但它们适用于元素的内容,而不是元素是否存在。例如。如果元素 foo 的默认值是“bar”,那么 将被视为 bar。而如果 完全丢失,那么它是 null/missing。
      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2011-06-26
      • 1970-01-01
      • 2017-11-12
      • 2019-01-20
      相关资源
      最近更新 更多