这是我的示例 XML 代码:
<bestContact>
<firstName><![CDATA[12345]]></firstName>
<lastName />
</bestContact>
我正在使用:
<xs:element name="lastName" type="xs:string" minOccurs="1" nillable="false"/>
XSD 应验证
lastName
不为 null 或空。
尝试
<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>
<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>
恕我直言,这是一个更好的模式:
<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>
@Kamal 在这里给了你基本上正确的答案。这就是为什么 -
nillable
似乎总是会引起问题。实际上,您可以将 nillable
视为含义 允许此元素上的 xsi:nil
属性。 XML Schema 规范 将 nillable 描述为带外信号 - 它基本上用于向数据库指示 NULL。
您想要的是一个元素,其长度必须至少为一个字符,如 @Kamal 给出的
这是我最喜欢的解决方案。
<xs:simpleType name="NonEmptyString">
<xs:restriction base="xs:string">
<xs:pattern value="[\s\S]*[^ ][\s\S]*"/>
</xs:restriction>
</xs:simpleType>
我的解决方案是使用
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"/>
不是必需的,但我喜欢它对于未来维护者的可读性。