Xerces-C XML XSD联合总是折叠空格

时间:2016-09-28 18:44:53

标签: xml xsd union xsd-validation xerces-c

我从XML Schema specification of whitespace了解到:

  

对于所有数据类型·派生·通过·union·whiteSpace不直接应用;但是,union·types的规范化行为由whiteSpace的值控制在·memberTypes·中的一个·unionTypes·成功验证了?union。

  

表示字符串,whiteSpace的值为

我正在尝试将XSD添加到现有的XML系统中。我有时需要匹配现有的杂乱字符串。例如,假设我需要匹配:

  <?xml version="1.0" encoding="UTF-8" ?>
  <root1 stuff="Hello World&#x09;!" />

使用这个(下面)XSD一切都很好,因为“对于xs:string,保留了空格的值”。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  
  <xs:simpleType name="Hello">
    <xs:restriction base="xs:string">
      <xs:pattern value="Hello World&#x09;!"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:element name="root1">
    <xs:complexType>
      <xs:attribute name="stuff" type="Hello" />
    </xs:complexType>
  </xs:element>
</xs:schema>

当我需要将“stuff”的合法值扩展到与其他简单类型联合时,问题就开始了。我发现这个问题并不关心我与之结合,或者我与任何东西结合在一起。因此,最简单的演示是将这些定义添加到上面的XSD中。

  <xs:simpleType name="HellUnion">
    <xs:union memberTypes="Hello" />
  </xs:simpleType>
  <xs:element name="root2">
    <xs:complexType>
      <xs:attribute name="stuff" type="HellUnion" />
    </xs:complexType>
  </xs:element>

然后Xerces-C拒绝此XML为无效:

<?xml version="1.0" encoding="UTF-8" ?>
<root2 stuff="Hello World&#x09;!" />

我认为错误信息很有启发性:

  

价值'Hello World!'与联合的任何成员类型都不匹配

注意'!'之前的空格选项卡之前的位置。

Microsoft .Net运行时XML / XSD系统将其报告为有效。

我尝试将whitespace = preserve添加到“Hello”简单类型定义中:

  <xs:simpleType name="Hello">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="preserve"/>
      <xs:pattern value="Hello World&#x09;!"/>
    </xs:restriction>
  </xs:simpleType>

这没有帮助。

以上是尝试简单地演示问题,但真正的问题来自允许空格的正则表达式的联合。在这种情况下,文档被发现是有效的,但返回给应用程序的值在验证时是“空白空间折叠”,在未验证时是未折叠的。

将产品从未经验证的XML移动到经过验证的XML时,这是一个问题。这些值需要在程序中的其他地方(不是XML)中精确匹配字符串值。

也许有人可以告诉我在简单类型上设置“空白区域”的更好方法吗?

0 个答案:

没有答案