Parsing 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

我一直认为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?

XML模式验证器根本不需要“生成解析器”。这当然是允许的,但这是一个实现细节。事实上,许多人没有这样做,他们建立了模式的内部表示,并解释它以根据模式验证文件

要确定带有空
元素的示例输入文档是否有效,验证器不需要知道该元素是否应解释为:

  • 名为
  • 名为
  • 名为
它不相关-它只需要知道
的内容在模型组中是否至少有一条路径

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

唯一粒子属性 需要明确的是,没有问题的原因是模式如何验证元素没有歧义——因为没有元素。所以在模型组和粒子声明之间有这样的歧义是可以的-在粒子声明之间有歧义是不可以的;需要弄清楚验证器通过模型组到达粒子的唯一路径。
但在您描述的情况下,这并不是问题所在。

您为什么在最后一句话中谈到代码生成?XML模式规范没有将“代码生成”作为其设计目标之一。可能有工具可以做到这一点,但这取决于他们使用哪种工具以及如何操作,所以您需要针对特定工具提出最后一个问题。