xsd可以模棱两可吗?

时间:2014-02-08 10:34:15

标签: parsing xsd

我一直认为XSD是一种指定XML文件语法的方法。现在我在现实世界的XSD规范中偶然发现了类似的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           xmlns:xlink="http://www.w3.org/1999/xlink" 
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified">
    <xs:element name="parser-killer">
        <xs:complexType>
          <xs:sequence minOccurs="0" maxOccurs="unbounded">
              <xs:element name="element" type="xs:string" minOccurs="0"/>
          </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

这里的问题是,人们无法决定空输入,例如

<parser-killer>
</parser-killer>

XML是否包含空序列或一系列空内容。 对于人眼来说这可能不是问题,但如果试图从该文件生成解析器,它可能最终永远循环(收集无限多个空元素)。

这只是滥用XSD还是在代码生成之前需要“清理”任何给定的XSD?

1 个答案:

答案 0 :(得分:0)

XML Schema验证器绝不需要“生成解析器”。它当然是允许的,但它是一个实现细节。实际上很多都没有,它们构建了模式的内部表示并解释它以根据模式验证文件。

要确定具有空<parser-killer>元素的示例输入文档是否有效,验证器不需要以了解此元素是否应解释为:

  • 零个或任意数量的名为<element>
  • 的零孩子序列
  • 无数个名为<element>
  • 的零孩子序列
  • 名为<element>
  • 的一百个孩子的零序列

它不相关 - 它只需要知道<parser-killer>的内容是否在模型组中至少有一条路径。

你可以 在验证器中应用一个简单的经验法则:如果没有元素子元素,并且有minOccurs="0"的序列(或选择或全部) ,那么这被认为是父母的内容有效的原因。这将阻止验证器在这种情况下无限循环。

独特粒子归因

要明确的是,没有问题的原因是模式如何验证元素没有歧义 - 因为没有元素。因此,在模型组和粒子声明之间存在这样的歧义是可以的 - 在粒子声明之间存在歧义是不可能的。需要明确的是,通过模型组的唯一路径是验证器到达粒子。 但在你描述的情况下,这不是问题。