我在构建模式时遇到问题,该模式将验证顺序所需的元素,后跟随机排序的可选元素。
此XML代码段是一个示例:
<?xml version="1.0" encoding="UTF-8" ?>
<messageExample>
<oprionalField1>3</oprionalField1>
<requiredField1>1234</requiredField1>
<requiredField2>WHA_12345678</requiredField2>
<oprionalField2/>
</messageExample>
它的XSD架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="messageExample">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="oprionalField1" minOccurs="0" type="xs:int" default="0" />
<xs:element name="requiredField1" minOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="requiredField2" minOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="oprionalField2" type="xs:string" minOccurs="0" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我需要使用<xs:choice>
,因为默认情况下架构会按照架构中列出的顺序等待消息节点。
当我传递空requredField1
时:<requiredField1></requiredField>
一切正常:它在验证期间抛出异常。但是,如果跳过此字段(未显示<requiredField1>
个标记),则不会抛出异常。
我该如何解决这种情况?如果错过了参数,我想要一个例外。
答案 0 :(得分:0)
解决方案是使用<xs:all>
代替<xs:choise>
。它对我很好。
xsd架构的示例:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="messageExample">
<xs:complexType>
<xs:all>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="oprionalField1" minOccurs="0" type="xs:int" default="0" />
<xs:element name="requiredField1" minOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="requiredField2" minOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="oprionalField2" type="xs:string" minOccurs="0" />
</xs:all>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>