假设我有这个验证xsd:
<xs:complexType name="MyInfo">
<xs:???>
<xs:element name="A" minOccurs="0" maxOccurs="1"/>
<xs:element name="B" minOccurs="0" maxOccurs="unbounded"/>
</xs:???>
</xs:complexType>
我希望它验证类
MyInfo
,它可以有:
示例:ABB、BAB、BBA、BB、A等
在生产中大约有 30 个这样的字段,为了简单起见,我只选择了 A,B。为了进行这种验证,我尝试在我的架构中使用各种标签而不是
???
:
sequence
- 强制订单验证,不起作用choice maxOccurs="unbound"
- 跳过 maxOccurs="1"
验证,不起作用all
- 不允许maxOccurs="unbounded"
,不工作any
- 允许所有 woo-doo 垃圾,不工作在 C# 中是否有完全禁用 XSD 订单验证的一致方法?我很少遇到需要检查的业务案例。我现在唯一的解决方案是将其设置为
choice maxOccurs="unbound"
并在 xsd 验证后分别验证元素的数量。
在 XSD 1.1 中,您可以使用
xsd:all
执行此操作,这消除了对 minOccurs 和 maxOccurs 的限制。在 XSD 1.0 中无法完成。
在使用 XSD 1.1 的实践中,我可能会选择将内容模型定义为 (A|B)* 并在断言中定义实际约束。
为什么 XSD 1.0 不允许这样做?我怀疑这是多种因素的综合作用。有些人可能会认为您的 XML 不是一个好的设计,XSD 只能描述设计良好的 XML。有些人可能认为内容模型应该只能描述特定类的语法,可以使用简单的有限状态机而不需要计数器来解析该语法。