【问题标题】:Restricting empty elements in xsd限制 xsd 中的空元素
【发布时间】:2011-01-24 21:22:43
【问题描述】:

有没有办法防止在您的 xml 中使用 <myElement/> 形式的空元素?换句话说,你能在你的xsd中指定<myElement/>是无效的吗?

使用nillable="false" 不起作用,minOccurs="1" 也不起作用 - 两者都允许 <myElement/>.

【问题讨论】:

    标签: xml validation xsd


    【解决方案1】:

    如果您想完全阻止该元素出现,您可以用maxOccurs="0" 标记它。我猜这不是您所追求的,因此,如果您要确保始终有属性附加到复杂元素,那么您必须在至少一个属性上指定 usage="required" 或使用一个属性组。如果myElement 是一个简单类型并且您想确保它有一个值,那么您总是可以限制它的类型。如果你想要一个非零字符串,那么你可以这样做:

    <xsd:element name="myElement">
        <xsd:simpleType>
            <xsd:restriction base="xsd:string">
                <xsd:minLength value="1" />
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:element>
    

    【讨论】:

    • 这看起来很有希望。如果它不是一个简单的类型怎么办,例如"xsd:日期"
    • xsd:date 是一个简单的类型。但如果不是简单类型,可以使用&lt;xsd:complexType&gt;。虽然,对于这些,我通常使用xsd:elementtype 属性,即:&lt;xsd:element name="myElement" type="someComplexType" /&gt;
    • 所以你是说minLength 是非字符串简单类型的有效属性?
    • 否,但如果您已将类型指定为 xsd:date ,那么空元素是不可接受的,因为它适用于几乎所有类型。
    • 不应该是maxOccurs="0",而不是minOccurs="0"吗?
    【解决方案2】:

    如果您的架构验证无法显示错误,当数据类型 DATE 的元素为空时,您可以使用模式 [如果键入所需格式不是您的负担];

    我添加了一个示例,类似代码的实现将适用于您的工具,

    这是示例 XML:

    <root>
       <date1>12/31/1999</date1> <!-- The Date format defined here is MM/DD/YYYY, null value or Date with any other format aren't accepted-->
    </root>
    

    这是对应的 XSD:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:include schemaLocation="Date_Def.xsd"/>
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="date1" type="DATE_TYPE" minOccurs="0" maxOccurs="1" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    请注意,我包含了另外一个包含 DATE_TYPE 类型定义的架构文件,
    这是 Date_Def.xsd 文件:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:simpleType name="DATE_TYPE">
        <xs:restriction base="xs:string">
          <xs:pattern value="([0][1-9]|[1][0-2])/([0][1-9]|[1-2][0-9]|[3][0-1])/[1-2][0-9][0-9][0-9]"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>
    

    此处定义的日期格式为 MM/DD/YYYY,不接受空值或任何其他格式的日期, 如果你还想接受一个空标签,用这个替换模式 ..

    <xs:pattern value="|(([0][1-9]|[1][0-2])/([0][1-9]|[1-2][0-9]|[3][0-1])/[1-2][0-9][0-9][0-9])"/>
    

    接受空标签或模式 MM/DD/YYYY 的日期值的验证。

    如果您在模式设计方面需要更多帮助,请随时在 SO 中发帖,希望对您有所帮助。 :-)

    [note::Type-Definition 也可以 在同一个文件中定义,这需要 中提到的其他命名空间 XML 以及 XSD 文件,定义一个 外部文件是无害的 可重复使用]

    【讨论】:

    • 感谢您的详细回复。我设法找到了正确进行验证的工具。这个模式的东西很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2013-10-10
    相关资源
    最近更新 更多