2014-03-12 54 views
0

我在構建模式時遇到了問題,該模式將驗證順序必需元素,隨後是隨機排序的可選元素。XSD必需元素xs:choice

該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

解決方法是使用<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> 
+2

這是不正確的。您的''標籤未關閉。 「xs:sequence」有一個結束標記,它從來沒有打開過,如果它應該關閉「」,它就處於文檔的錯誤層次。無論如何,選擇不是一個有效的孩子!這是不可能的! –