我必须为已经使用的XML格式制作模式。现有的XML已由不同的程序生成,听起来很难找到需要更改的所有位置以便使用更常规的XML格式。
这是一个类似于我们的XML结构的例子:
<data>
<summary>some info</summary>
<error>error message (only if there was an error)</error>
<details>more info
<x>more</x>
<y>even more</y>
</details>
<error>another error message</error>
<z>some extra info</z>
</data>
请注意,错误标记在同一级别重复使用,并且在某些项目之后但不在其他项目之后,因此我不能只设置maxOccurs =“unbounded”。我已经尝试在xsd:sequence中包装相关的错误/其他标记对,但这并不能解决问题,因为我仍然在有效地打破了“唯一粒子归因”规则。
甚至可以这样做,还是我需要让其他开发人员知道这个架构不会验证?
答案 0 :(得分:2)
我对XML schema standard的解读说你可能很安全。您只需在模式中定义具有相同名称的非连续元素,以反映将生成(或可以)生成的XML。只要所有“错误”实例总是由其他元素分隔而不是连续的,这应该不是问题。例如,像:
<xs:element name="data"> <xs:complexType> <xs:sequence> <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" /> <xs:element ref="error" minOccurs="1" maxOccurs="1" /> <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" /> <xs:element ref="error" minOccurs="1" maxOccurs="1" /> <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="error" type="xs:string"/> <xs:complexType name="detailsType"> .... </xs:complexType>
如果详细信息有minOccurs =“0”且上面的第一个“错误”有一个maxOccurs&gt; 1,然后您失败了Unique Particle Attribution规则,因为验证无法验证,如果一行中有两个错误元素,那么它们所属的架构中的“错误”实例。但是,只要每个“错误”实例都可以在模式中唯一标识,由于错误元素和插入元素的良好使用“minOccurs”和“maxOccurs”,那么你就是好的。
只要模式验证器始终可以使用minOccurs和maxOccurs(例如)明确地确定引用哪个实例,您甚至可以连续出现“错误”实例。
想想xhtml,其中元素可以以任意顺序出现,任意重复。
编辑:已更新,以反映原始问题中的修改。