XSD - 在 XML 模式中使元素可选和强制
XSD - Making elements optional and mandatory in an XML schema
我为 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 是一个 mandatory 元素。
当我尝试一个没有 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,以及必需的 SimpleType2,就会出现问题.
我期望的消息与上面的消息相同 - 因为所有其他元素在序列中使用 minOccurs="0"
变为可选
然而,我收到的实际错误信息是:
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 是强制性的,而所有其他的都是可选的。
有什么办法可以解决这个问题吗?
模式验证器查看每个元素并决定该元素是否允许出现在当前位置。如果它找到一个不允许的元素,或者找到不允许序列结尾的序列结尾,那么它会为您提供一个可以有效出现在当前位置的元素列表。这就是它设计的工作方式,您将无法更改它。
我为 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 是一个 mandatory 元素。
当我尝试一个没有 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,以及必需的 SimpleType2,就会出现问题.
我期望的消息与上面的消息相同 - 因为所有其他元素在序列中使用 minOccurs="0"
变为可选然而,我收到的实际错误信息是:
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 是强制性的,而所有其他的都是可选的。
有什么办法可以解决这个问题吗?
模式验证器查看每个元素并决定该元素是否允许出现在当前位置。如果它找到一个不允许的元素,或者找到不允许序列结尾的序列结尾,那么它会为您提供一个可以有效出现在当前位置的元素列表。这就是它设计的工作方式,您将无法更改它。