代码之家  ›  专栏  ›  技术社区  ›  Sarang Agarwal

XSD-在XML模式中使元素成为可选和必需的

  •  0
  • Sarang Agarwal  · 技术社区  · 6 年前

    我为XML生成的架构如下所示:

     <xs:complexType name="ComplexElement1">
            <xs:sequence>
                <xs:element name="ComplexType1" type="ComplexType1">
                </xs:element>
                <xs:element name="ComplexType2" type="ComplexType2" minOccurs="0">
                </xs:element>
                <xs:element name="ComplexType3">
                    <xs:complexType>
                        <xs:sequence maxOccurs="unbounded">
                            <xs:element name="ComplexType4" type="ComplexType4"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="ComplexType5" type="ComplexType5" minOccurs="0"/>
                <xs:element name="ComplexType6" type="ComplexType6" minOccurs="0" maxOccurs="1"/>
                <xs:element name="SimpleType1" type="xs:string" minOccurs="0" maxOccurs="1"/>
                <xs:element name="ComplexType7" type="ComplexType7" minOccurs="0" maxOccurs="1"/>
                <xs:element name="SimpleType2" minOccurs="1" maxOccurs="1" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="Attribute1" type="StringLength3WithNoSpace" use="required"/>
            <xs:attribute name="Attribute2" type="ComplexAttribute1"/>
            <xs:attribute name="Attribute3" type="xs:boolean" use="optional"/>
        </xs:complexType>
    

    从XSD中可以看到,ComplexType 5、6和7以及SimpleType 1都是 可选元素 而且,SimpleType2是 强制性的 元素。

    当我在请求中没有SimpleType2的情况下尝试请求时,我希望得到一条类似于

    Message validation failed. Errors: [cvc-complex-type.2.4.b: The content of element 'ComplexElement1' is not complete. One of '{"somePath":SimpleType2}' is expected.]
    

    但是,如果我没有 任何 在可选元素ComplexType 5、6和7、SimpleType 1以及必需的SimpleType 2中,有一个问题。

    但是,我收到的实际错误消息是:

    Message validation failed. Errors: [cvc-complex-type.2.4.b: The content of element 'ComplexElement1' is not complete. One of '{"somePath":ComplexType5, "somePath":ComplexType6, "somePath":SimpleType1, "somePath":ComplexType7, "somePath":SimpleType2}' is expected.]<
    

    这并不是真的正确,因为我的模式只将SimpleType2定义为强制的,而所有其他的都是可选的。

    我能做些什么来解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Michael Kay    6 年前

    模式验证器查看每个元素,并决定是否允许该元素位于当前位置。如果它找到不允许的元素,或者找到不允许序列结尾的序列结尾,那么它会给您一个可以有效显示在当前位置的元素列表。这就是它设计的工作方式,你无法改变它。

    推荐文章