不明确的XML模式
我正在尝试为类似以下内容的XML生成一个非常简单的XML模式:不明确的XML模式,xml,xsd,ambiguity,Xml,Xsd,Ambiguity,我正在尝试为类似以下内容的XML生成一个非常简单的XML模式: <messages> <item> <important_tag></important_tag> </item> <item> <important_tag></important_tag> <tag2></tag2> </item> <item>
<messages>
<item>
<important_tag></important_tag>
</item>
<item>
<important_tag></important_tag>
<tag2></tag2>
</item>
<item>
<tag2></tag2>
<tag3></tag3>
</item>
</messages>
其思想是,
将有一个特定的定义,它可能出现在
下,也可能不出现。它也可能出现不止一次。
此外,在
之前或之后可能还有其他我无法预先命名的标记
我想给出
的具体定义。例如,定义它必须包含的属性。
我的意思是如果出现了重要标签,它必须符合我的定义。任何其他标记都不必符合任何定义
我尝试使用以下方案:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="messages">
<xs:complexType>
<xs:sequence>
<xs:element ref="item" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="important_tag">
<xs:complexType>
<xs:simpleContent>
... specific definitions for important_tag ...
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
... 重要标签的特定定义。。。
这会导致一个错误,即模式不明确
确切的错误消息是:
cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups.
cos nonambig:“”使内容模型对“”不确定。可能原因:名称相等、重复出现或替换组。
我正在使用Altova的XML Spy
我如何解决这个问题
谢谢,
Dana在MSDN上有一篇关于设计可扩展模式的文章,您可以找到,我建议您通读所有内容,但具体到您的观点,它解释了为什么在第2点中会出现此错误。在“使用XML模式设计可版本化的XML格式”下(您可以搜索“非确定性”并直接访问)
基本上,一旦您有了xs:any元素,验证器就不能对其他同级元素做任何假设,因此-您很可能有一个重要标记的定义,它不需要那些强制属性,因此这些元素无法根据您的要求进行验证(例如“任何其他标记都不必符合任何定义。”),它基于规则(“this must's true”,“that must's false”),可能是比W3C模式更好的解决方案,W3C模式更“一切都必须如此”“关于错误:该错误消息提到一行不在您包含的xsd中,但其中的这两行不明确:
<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>
显示歧义的最简单示例是,如果只有一个
:
问题是它可以被解释为一个“重要”标记和零个“任何”标记(这是您想要的),但它也可以被解释为零个“重要”标记和一个“任何”标记。这是因为“任何”标记可以匹配任何标记,包括“重要”标记
我已经读到,下一个版本的XMLSchema允许您说出您的意思:除了重要的标记之外的任何标记
以两种不同的方式匹配XML类似于正则表达式“a*a*”以两种不同的方式匹配“a”(第一种方式是“a”;第二种方式是“a”)。在DTD的XML规范中,这种模糊性过去被称为“非确定性”,但XML模式规范称之为唯一粒子属性规则(UPA),这意味着您应该能够知道模式的哪一部分获取XML文档的每一部分。您可以发布您获取的确切错误消息以及您使用的工具吗?您是对的,这正是问题所在。我通过“更改规则”克服了它,即强制实施更严格的模式。感谢您在标记名上的注释-也更改了:)
<important_tag></important_tag>