XmlSchema Whitespace崩溃:多个空格会发生什么?

cra*_*her 6 xml schema whitespace

我使用以下XmlSchema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.test.com/XmlValidation"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"
  xmlns:m="http://www.test.com/XmlValidation">

  <xs:element name="test">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="testElement" type="m:requiredStringType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="requiredStringType">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
      <xs:whiteSpace value="collapse"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

它定义了一个requiredStringType,它必须至少有一个字符长,并且还定义了空白崩溃.

当我验证以下Xml文档时,验证成功:

<?xml version="1.0" encoding="UTF-8"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.text.com/XmlValidation">
    <testElement>     </testElement>
</test>
Run Code Online (Sandbox Code Playgroud)

w3.org定义了空白崩溃:

"在替换所暗示的处理之后,#x20的连续序列被折叠为单个#x20,并且前导和尾随#x20被删除."

这是否意味着3个空格被折叠为一个或零个空格?在XmlSpy中,验证失败,在.Net中它成功.

Edd*_*die 6

由于它表示删除了前导和尾随空格,这意味着只包含空格的字符串将折叠为空字符串.XmlSpy在验证中是准确的,而.NET是慷慨的(或者是出错).

这是根据验证期间空白规范化,从XML Schema第一部分:结构第二版.

保留
不进行标准化,值为·标准化值·
替换
#x9(空格)替换所有出现的#x9(制表符),#xA(换行符)和#xD(回车符)>.
崩溃
在替换上面指定的替换之后,将#x20s的连续序列折叠为单个#x20,并删除初始和/或最终#x20s.

因此,首先将所有空格替换为空白字符,将第二个连续序列替换为单个空白字符,第三个和最后一个,删除初始和最终空白.在此序列之后,在验证期间必须将仅包含空格的字符串规范化为空字符串.