2015-09-07 123 views
0

我想創建一個xsd來驗證一些xml。如果沒有找到成員元素,我希望xsd失敗,我認爲添加minOccurs =「1」會達到這個目的,但由於某些原因,即使傳遞了0個成員元素。XSD必需元素

<xs:attributeGroup name="memberAttributes"> 
    <xs:annotation> 
     <xs:documentation>Set of attributes for member element</xs:documentation> 
    </xs:annotation> 
    <xs:attribute name="employeeid" type="xs:string" use="required"/> 
    <xs:attribute name="dob" type="Shortdate" use="required"/> 
    <xs:attribute name="gender" type="Gender" use="required"/> 
    <xs:attribute name="salary" use="required"> 
     <xs:simpleType> 
     <xs:restriction base="Amount2dp"> 
      <xs:totalDigits value="13"/> 
      <xs:maxInclusive value="99999999999.99"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    <xs:attribute name="postcode" type="Postcode" use="required"/> 
    </xs:attributeGroup> 

    <xs:element name="member"> 
    <xs:annotation> 
     <xs:documentation>Member element</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:attributeGroup ref="memberAttributes"/> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="members"> 
    <xs:annotation> 
     <xs:documentation>Set of member elements</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
     <xs:element ref="member"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
+1

你可以發佈你的xml實例嗎? –

+0

你使用的驗證處理器是什麼? – Abel

回答

1

添加確實指定必需的元素的方式。你的XSD應該達到你所尋求的結果。

確認:您的XSD,做成單機:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:attributeGroup name="memberAttributes"> 
    <xs:annotation> 
     <xs:documentation>Set of attributes for member element</xs:documentation> 
    </xs:annotation> 
    <xs:attribute name="employeeid" type="xs:string" use="required"/> 
    <xs:attribute name="dob" use="required"/> 
    <xs:attribute name="gender" use="required"/> 
    <xs:attribute name="salary" use="required"> 
     <xs:simpleType> 
     <xs:restriction base="xs:decimal"> 
      <xs:totalDigits value="13"/> 
      <xs:maxInclusive value="99999999999.99"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    <xs:attribute name="postcode" use="required"/> 
    </xs:attributeGroup> 

    <xs:element name="member"> 
    <xs:annotation> 
     <xs:documentation>Member element</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:attributeGroup ref="memberAttributes"/> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="members"> 
    <xs:annotation> 
     <xs:documentation>Set of member elements</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence minOccurs="1" maxOccurs="unbounded"> 
     <xs:element ref="member"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

會發現這個XML文檔是有效的:

<?xml version="1.0" encoding="UTF-8"?> 
<members> 
    <member employeeid="" dob="" gender="" salary="1.0" postcode=""/> 
    <member employeeid="" dob="" gender="" salary="1.0" postcode=""/> 
</members> 

但是會發現這個XML文檔無效:

<?xml version="1.0" encoding="UTF-8"?> 
<members/> 

將發出一個錯誤,如以下:

[錯誤] try.xml:3:52:CVC-復type.2.4.b:元件 '成員' 的內容不完整。預計會有'{member}'之一。

最後一點:xs:sequence配售minOccursmaxOccurs表示對整個序列requiredness和基數約束。在這種情況下,序列中只有一個member元素,因此這些表單是等價的,但在xs:sequence的子元素更多時要注意區分。