我一直认为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?
答案 0 :(得分:0)
XML Schema验证器绝不需要“生成解析器”。它当然是允许的,但它是一个实现细节。实际上很多都没有,它们构建了模式的内部表示并解释它以根据模式验证文件。
要确定具有空<parser-killer>
元素的示例输入文档是否有效,验证器不需要以了解此元素是否应解释为:
<element>
<element>
<element>
它不相关 - 它只需要知道<parser-killer>
的内容是否在模型组中至少有一条路径。
你可以 在验证器中应用一个简单的经验法则:如果没有元素子元素,并且有minOccurs="0"
的序列(或选择或全部) ,那么这被认为是父母的内容有效的原因。这将阻止验证器在这种情况下无限循环。
要明确的是,没有问题的原因是模式如何验证元素没有歧义 - 因为没有元素。因此,在模型组和粒子声明之间存在这样的歧义是可以的 - 在粒子声明之间存在歧义是不可能的。需要明确的是,通过模型组的唯一路径是验证器到达粒子。 但在你描述的情况下,这不是问题。