XSD 1.0 无法对无序 XML 进行验证

问题描述 投票:0回答:1

假设我有这个验证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
,它可以有:

  1. 零个或一个元素 A
  2. 任意数量的 B
  3. 元素任意顺序

示例:ABB、BAB、BBA、BB、A

在生产中大约有 30 个这样的字段,为了简单起见,我只选择了 AB。为了进行这种验证,我尝试在我的架构中使用各种标签而不是

???

  1. sequence
    - 强制订单验证,不起作用
  2. choice maxOccurs="unbound"
    - 跳过
    maxOccurs="1"
    验证,不起作用
  3. all
    - 不允许
    maxOccurs="unbounded"
    ,不工作
  4. any
    - 允许所有 woo-doo 垃圾,不工作

在 C# 中是否有完全禁用 XSD 订单验证的一致方法?我很少遇到需要检查的业务案例。我现在唯一的解决方案是将其设置为

choice maxOccurs="unbound"
并在 xsd 验证后分别验证元素的数量。

c# xml xsd
1个回答
0
投票

在 XSD 1.1 中,您可以使用

xsd:all
执行此操作,这消除了对 minOccurs 和 maxOccurs 的限制。在 XSD 1.0 中无法完成。

在使用 XSD 1.1 的实践中,我可能会选择将内容模型定义为 (A|B)* 并在断言中定义实际约束。

为什么 XSD 1.0 不允许这样做?我怀疑这是多种因素的综合作用。有些人可能会认为您的 XML 不是一个好的设计,XSD 只能描述设计良好的 XML。有些人可能认为内容模型应该只能描述特定类的语法,可以使用简单的有限状态机而不需要计数器来解析该语法。

© www.soinside.com 2019 - 2024. All rights reserved.