【问题标题】:XSD Element Not Null or Empty Constraint For Xml?XSD 元素不是空的或 Xml 的空约束?
【发布时间】:2010-12-10 11:02:55
【问题描述】:

这是我的示例 XML 代码:

<bestContact>
<firstName><![CDATA[12345]]></firstName>
<lastName />
</bestContact>

我正在使用:

<xs:element name="lastName" type="xs:string" minOccurs="1" nillable="false"/>

XSD 应验证 lastName 不为 null 或为空。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:
    <xsd:element name="lastName" type="NonEmptyString" nillable="false"/>
    
    <xsd:simpleType name="NonEmptyString">
      <xsd:restriction base="xs:string">
        <xsd:minLength value="1" />
        <xsd:pattern value=".*[^\s].*" />
      </xsd:restriction>
    </xsd:simpleType>
    

    【讨论】:

    • 我比 Gab 提供的 2 更喜欢这个,这个对我有用。因为我正在寻找一个刚刚摆脱前导空格的表达式,而不是文本之间的空格
    • 我认为你可以用 \S+ 替换这个正则表达式,正如 Gab 指出的那样。
    【解决方案2】:

    恕我直言,这是一个更好的模式:

    <xs:simpleType name="NonEmptyString">
       <xs:restriction base="xs:string">
          <xs:pattern value="^(?!\s*$).+" />
       </xs:restriction>
    </xs:simpleType>
    

    <xs:simpleType name="NonEmptyStringWithoutSpace">
       <xs:restriction base="xs:string">
          <xs:pattern value="\S+"/>
       </xs:restriction>
    </xs:simpleType>
    

    【讨论】:

    • 您的第一个提案比第二个提案有什么优势吗?
    • 第一个允许(非空)空白字符串,但第二个不允许。这取决于您的需求
    • 我怎样才能有一个 可选,模式 ,因为它是可选的,有一个类型,不能为空!!!!是否有可能是具有类型模式的 null ?
    • (? 会导致 xsd 无效,因此第一种解决方案将不起作用
    【解决方案3】:

    试试

    <xs:element name="lastName" minOccurs="1" nillable="false">
      <xs:simpleType>
         <xs:restriction base="xs:string">
           <xs:minLength value="1"/>
         </xs:restriction>
      </xs:simpleType>
    </xs:element>
    

    【讨论】:

    • @Nic - 同意。我刚刚复制并粘贴了问题中的行:)
    • 使用这个我得到“元素'lastName'同时具有'type'属性和'anonymous type'子元素。元素只允许其中一个。”我认为在容器元素中使用 type="xs:string" 存在问题。
    【解决方案4】:

    @Kamal 在这里给了你基本正确的答案。这就是为什么 - nillable 似乎总是会引起问题。实际上,您可以将nillable 视为允许此元素上的xsi:nil 属性XML Schema spec 将 nillable 描述为带外信号 - 它基本上用于向数据库指示 NULL

    你想要的是一个元素,它必须至少是@Kamal 给出的一个字符

    【讨论】:

      【解决方案5】:

      这是我最喜欢的解决方案。

      <xs:simpleType name="NonEmptyString">
          <xs:restriction base="xs:string">
              <xs:pattern value="[\s\S]*[^ ][\s\S]*"/>
          </xs:restriction>
      </xs:simpleType>
      

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2016-11-02
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多