为什么空格中断验证?

时间:2016-03-01 14:27:00

标签: regex xml xsd

在我的XML架构中,我创建了一个名为NonEmptyString的类型。它应该拒绝任何null值或只包含空格的值。我转过身去说它应该接受任何至少有一个非空白字符的东西。这应该包括两个非空白字符之间的空格。但是,它在接受“BATCH_ANNEAL”时拒绝“BATCH ANNEAL”。

如果重要,我将在Python 3脚本中使用此架构,尽管this XML validator也拒绝它。

这是XML Schema定义:

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

2 个答案:

答案 0 :(得分:2)

模式始终必须与整个值匹配。 \S+"BATCH_ANNEAL"匹配,但与"BATCH ANNEAL"不匹配。

尝试

<xs:pattern value="\S+|\S.*\S" />

强制执行完全非空白或以非空白字符开头和结尾的值。如有必要,请使用比.更具体的内容。

答案 1 :(得分:1)

这是@ Tomalak(精细,+1)基于正则表达式的解决方案的替代方案。此方法使用xs:minLengthxs:whiteSpace方面而不是xs:pattern正则表达式:

<xs:simpleType name="NonEmptyString">
   <xs:restriction base="xs:string">
    <xs:minLength value="1" />
    <xs:whiteSpace value='collapse'/>
   </xs:restriction>
</xs:simpleType>