xs:choice中的XSD必需元素

时间:2014-03-12 15:33:29

标签: xml xsd xsd-validation

我在构建模式时遇到问题,该模式将验证顺序所需的元素,后跟随机排序的可选元素。

此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>个标记),则不会抛出异常。

我该如何解决这种情况?如果错过了参数,我想要一个例外。

1 个答案:

答案 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>