为什么 space 会在此处中断验证?
Why does a space break validation here?
在我的 XML 架构中,我创建了一个名为 NonEmptyString
的类型。它应该拒绝任何 null 值或仅由空格组成的值。我把它反过来说它应该接受任何至少有一个非空白字符的东西。这应该包括两个非空白字符之间带有空白的任何内容。但是,它在接受 "BATCH_ANNEAL".
时拒绝 "BATCH ANNEAL"
以防万一,我将在 Python 3 脚本中使用此架构,尽管 this XML validator 也拒绝了它。
这里是 XML 架构定义:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="NonEmptyString">
<xs:restriction base="xs:string">
<xs:pattern value="\S+" />
</xs:restriction>
</xs:simpleType>
<xs:element name="MESSAGE">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:short" name="MESSAGE_NUMBER"/>
<xs:element type="NonEmptyString" name="MESSAGE_TYPE"/>
<xs:element type="NonEmptyString" name="PLANT_CODE"/>
<xs:element type="NonEmptyString" name="PLANT_TEXT"/>
<xs:element type="xs:dateTime" name="TIMESTAMP"/>
<xs:element type="NonEmptyString" name="SIMULATION_INDEX"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这是我要验证的元素。
<MESSAGE>
<MESSAGE_NUMBER>2601</MESSAGE_NUMBER>
<MESSAGE_TYPE>MaterialData</MESSAGE_TYPE>
<PLANT_CODE>ANBA</PLANT_CODE>
<PLANT_TEXT>BATCH ANNEAL</PLANT_TEXT>
<TIMESTAMP>2016-03-01T08:54:53</TIMESTAMP>
<SIMULATION_INDEX>N</SIMULATION_INDEX>
</MESSAGE>
模式必须始终匹配整个值。 \S+
匹配 "BATCH_ANNEAL"
但不匹配 "BATCH ANNEAL"
.
尝试
<xs:pattern value="\S+|\S.*\S" />
强制执行完全非空白或以非空白字符开头和结尾的值。如有必要,请使用比 .
更具体的内容。
这是@Tomalak(很好,+1)基于正则表达式的解决方案的替代方案。此方法使用 xs:minLength
and xs:whiteSpace
facets instead of an xs:pattern
正则表达式:
<xs:simpleType name="NonEmptyString">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:whiteSpace value='collapse'/>
</xs:restriction>
</xs:simpleType>
在我的 XML 架构中,我创建了一个名为 NonEmptyString
的类型。它应该拒绝任何 null 值或仅由空格组成的值。我把它反过来说它应该接受任何至少有一个非空白字符的东西。这应该包括两个非空白字符之间带有空白的任何内容。但是,它在接受 "BATCH_ANNEAL".
以防万一,我将在 Python 3 脚本中使用此架构,尽管 this XML validator 也拒绝了它。
这里是 XML 架构定义:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="NonEmptyString">
<xs:restriction base="xs:string">
<xs:pattern value="\S+" />
</xs:restriction>
</xs:simpleType>
<xs:element name="MESSAGE">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:short" name="MESSAGE_NUMBER"/>
<xs:element type="NonEmptyString" name="MESSAGE_TYPE"/>
<xs:element type="NonEmptyString" name="PLANT_CODE"/>
<xs:element type="NonEmptyString" name="PLANT_TEXT"/>
<xs:element type="xs:dateTime" name="TIMESTAMP"/>
<xs:element type="NonEmptyString" name="SIMULATION_INDEX"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这是我要验证的元素。
<MESSAGE>
<MESSAGE_NUMBER>2601</MESSAGE_NUMBER>
<MESSAGE_TYPE>MaterialData</MESSAGE_TYPE>
<PLANT_CODE>ANBA</PLANT_CODE>
<PLANT_TEXT>BATCH ANNEAL</PLANT_TEXT>
<TIMESTAMP>2016-03-01T08:54:53</TIMESTAMP>
<SIMULATION_INDEX>N</SIMULATION_INDEX>
</MESSAGE>
模式必须始终匹配整个值。 \S+
匹配 "BATCH_ANNEAL"
但不匹配 "BATCH ANNEAL"
.
尝试
<xs:pattern value="\S+|\S.*\S" />
强制执行完全非空白或以非空白字符开头和结尾的值。如有必要,请使用比 .
更具体的内容。
这是@Tomalak(很好,+1)基于正则表达式的解决方案的替代方案。此方法使用 xs:minLength
and xs:whiteSpace
facets instead of an xs:pattern
正则表达式:
<xs:simpleType name="NonEmptyString">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:whiteSpace value='collapse'/>
</xs:restriction>
</xs:simpleType>