XML Schema模糊内容模型问题:合法定义Survey复杂类型的方法
解决XML Schema中Survey类型的内容模型歧义问题
要解决这个歧义报错,核心是让XML Schema解析器能通过第一个元素唯一确定匹配的内容分支,避免出现「看到Topics元素时,分不清是单独的Topics还是Topics+Questions序列的开头」这种模糊场景。
合法内容组合的无歧义实现
直接把所有合法组合拆分为三个互斥的分支,放在xs:choice中,每个分支的起始元素唯一,解析器能立刻判断走哪条路:
<!-- 先提前声明Topics、Questions、Answers元素(替换为你实际的类型) --> <xs:element name="Topics" type="xs:string"/> <xs:element name="Questions" type="xs:string"/> <xs:element name="Answers" type="xs:string"/> <xs:complexType name="Survey"> <xs:choice> <!-- 分支1:单独Topics 或 Topics+Questions --> <xs:sequence> <xs:element ref="Topics"/> <xs:element ref="Questions" minOccurs="0"/> </xs:sequence> <!-- 分支2:单独Questions 或 Questions+Answers --> <xs:sequence> <xs:element ref="Questions"/> <xs:element ref="Answers" minOccurs="0"/> </xs:sequence> <!-- 分支3:单独Answers --> <xs:element ref="Answers"/> </xs:choice> </xs:complexType>
为什么这个写法能避免歧义?
解析器看到第一个元素时,能100%确定匹配的分支:
- 第一个元素是
Topics→ 只能走第一个分支(要么单独Topics,要么后面跟Questions) - 第一个元素是
Questions→ 只能走第二个分支(要么单独Questions,要么后面跟Answers) - 第一个元素是
Answers→ 只能走第三个分支(单独Answers)
验证覆盖所有需求场景
这个定义完全覆盖了你需要的所有内容组合:
- 单独的Topics/Questions/Answers:分别对应分支1(不写Questions)、分支2(不写Answers)、分支3
- Topics+Questions:分支1同时写Topics和Questions
- Questions+Answers:分支2同时写Questions和Answers
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

