Parsing xsd会是不明确的吗?
我一直认为XSD是一种指定XML文件语法的方法。现在我在现实世界的XSD规范中偶然发现了类似的东西:Parsing xsd会是不明确的吗?,parsing,xsd,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
<?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?XML模式验证器根本不需要“生成解析器”。这当然是允许的,但这是一个实现细节。事实上,许多人没有这样做,他们建立了模式的内部表示,并解释它以根据模式验证文件 要确定带有空
元素的示例输入文档是否有效,验证器不需要知道该元素是否应解释为:
- 名为
- 名为
- 名为
的内容在模型组中是否至少有一条路径
您可以在验证器中应用一个简单的经验法则:如果没有元素子元素,并且有一个序列(或选项,或全部)带有minOccurs=“0”
,那么这就是父元素内容有效的原因。这将阻止验证器在这种情况下无限循环
唯一粒子属性
需要明确的是,没有问题的原因是模式如何验证元素没有歧义——因为没有元素。所以在模型组和粒子声明之间有这样的歧义是可以的-在粒子声明之间有歧义是不可以的;需要弄清楚验证器通过模型组到达粒子的唯一路径。
但在您描述的情况下,这并不是问题所在。您为什么在最后一句话中谈到代码生成?XML模式规范没有将“代码生成”作为其设计目标之一。可能有工具可以做到这一点,但这取决于他们使用哪种工具以及如何操作,所以您需要针对特定工具提出最后一个问题。