2015-09-07 126 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的子元素更多时要注意区分。