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

时间:2009-03-20 13:42:26

标签: 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>

它定义了一个必须至少有一个字符长的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>

w3.org定义了空白崩溃:

“在替换隐含的处理之后,#x20的连续序列被折叠为单个#x20,并且前导和尾随#x20被删除。”

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

2 个答案:

答案 0 :(得分:6)

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

这是根据White Space Normalization during ValidationXML Schema Part 1: Structures Second Edition提供的。

  

<强>保留
      没有进行归一化,值是·归一化值·
  的替换
      所有出现的#x9(tab),#xA(换行)和#xD(回车)都被替换了&gt; #x20(空格)。
  的崩溃
      在替换之后指定的替换之后,连续的序列   将#x20s折叠为单个#x20,删除初始和/或最终#x20s。

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

答案 1 :(得分:0)

这似乎适用于.Net(注意模式方面),撒克逊人不需要这种模式。

<xs:element name="StoreCode" minOccurs="1">
<xs:simpleType>                         
    <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse"/>
        <xs:pattern value=""/>
        <xs:minLength value="1"/>
        <xs:maxLength value="15"/>
    </xs:restriction>
</xs:simpleType>
</xs:element>