XSD 元素不为 Null 或 Xml 的空约束?

问题描述 投票:0回答:6

这是我的示例 XML 代码:

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

我正在使用:

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

XSD 应验证

lastName
不为 null 或空。

xml xsd
6个回答
61
投票

尝试

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

22
投票
<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>

11
投票

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

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

9
投票

@Kamal 在这里给了你基本上正确的答案。这就是为什么 -

nillable
似乎总是会引起问题。实际上,您可以将
nillable
视为含义 允许此元素上的
xsi:nil
属性
XML Schema 规范 将 nillable 描述为带外信号 - 它基本上用于向数据库指示 NULL

您想要的是一个元素,其长度必须至少为一个字符,如 @Kamal 给出的


0
投票

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

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

0
投票

我的解决方案是使用

xs:token
因此忽略前导和尾随空格,并使用一个简单的正则表达式来验证是否存在至少一个非空白字符:

  <xs:simpleType name="NonEmptyElementType">
    <xs:restriction base="xs:token">
      <xs:minLength value="1"/>
      <xs:pattern value=".*\S.*"/>
    </xs:restriction>
  </xs:simpleType>

<xs:minLength value="1"/>
不是必需的,但我喜欢它对于未来维护者的可读性。

© www.soinside.com 2019 - 2024. All rights reserved.