验证具有空属性的XML模式

时间:2010-04-13 11:23:21

标签: xml xsd xml-validation

我无法验证我的xml架构。

我在架构上遇到这些错误

  

113:18 s4s-elt-invalid-content.1:The   '#AnonType_user'的内容是   无效。

     

164:17 s4s-elt-invalid-content.1:The   '#AnonType_festival'的内容是   无效。元素'序列'是   无效,错位或发生   常。

并且因为这两个错误,我得到了相同错误的负载。这是因为节日标签的属性id可能是空的,因为没有该节日的数据

  

cvc-datatype-valid.1.2.1:''不是   '整数'的有效值。

     

cvc-attribute.3:值''   元素'festival'上的属性'id'   在类型方面无效,   '整数'。

导致问题的架构中的行是

<xs:element name="user">
  <xs:complexType>
 <xs:attribute name="id" type="xs:integer"/>
   <xs:sequence>
  <xs:element ref="personal"/>
  <xs:element ref="account"/> 
   </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="festival">
  <xs:complexType>
 <xs:attribute name="id" type="xs:integer" user="optional"/>
  <xs:sequence>
   <xs:element ref="event"/>
   <xs:element ref="contact"/> 
 </xs:sequence>
  </xs:complexType>
</xs:element>

这是我的XML文件的片段。一个用户有一个节日而另一个用户没有

<member>
 <user id="3">
  <personal>
   <name>Skye Saunders</name>
   <sex>Female</sex>
   <address1>31 Anns Court</address1>
   <address2></address2>
   <city>Cirencester</city>
   <county>Gloucestershire</county>
   <postcode>GL7 1JG</postcode>
   <telephone>01958303514</telephone>
   <mobile>07260491667</mobile>
   <email>bigundecided@hotmail.co.uk</email>
  </personal>
  <account>
   <username>BigUndecided</username>
   <password>ea297847f80e046ca24a8621f4068594</password>
   <userlevel>2</userlevel>
   <signupdate>2010-03-26T09:23:50</signupdate>
  </account>
 </user>
 <festival id="">
  <event>
   <eventname></eventname>
   <url></url>
   <datefrom></datefrom>
   <dateto></dateto>
   <location></location>
   <eventpostcode></eventpostcode>
   <coords>
    <lat></lat>
    <lng></lng>
   </coords>
  </event>
  <contact>
   <conname></conname>
   <conaddress1></conaddress1>
   <conaddress2></conaddress2>
   <concity></concity>
   <concounty></concounty>
   <conpostcode></conpostcode>
   <contelephone></contelephone>
   <conmobile></conmobile>
   <fax></fax>
   <conemail></conemail>
  </contact>
 </festival>
</member>
<member>
 <user id="4">
  <personal>
   <name>Connor Lawson</name>
   <sex>Male</sex>
   <address1>12 Ash Way</address1>
   <address2></address2>
   <city>Swindon</city>
   <county>Wiltshire</county>
   <postcode>SN3  6GS</postcode>
   <telephone>01791928119</telephone>
   <mobile>07338695664</mobile>
   <email>itunestinker@fsmail.co.uk</email>
  </personal>
  <account>
   <username>iTuneStinker</username>
   <password>3a1f5fda21a07bfff20c41272bae7192</password>
   <userlevel>3</userlevel>
   <signupdate>2010-03-26T09:23:50</signupdate>
  </account>
 </user>
 <festival id="1">
  <event>
   <eventname>Oxford Folk Festival</eventname>
   <url>http://www.oxfordfolkfestival.com/</url>
   <datefrom>2010-04-07</datefrom>
   <dateto>2010-04-09</dateto>
   <location>Oxford</location>
   <eventpostcode>OX19BE</eventpostcode>
   <coords>
    <lat>51.735640</lat>
    <lng>-1.276136</lng>
   </coords>
  </event>
  <contact>
   <conname>Stuart Vincent</conname>
   <conaddress1>P.O. Box 642</conaddress1>
   <conaddress2></conaddress2>
   <concity>Oxford</concity>
   <concounty>Bedfordshire</concounty>
   <conpostcode>OX13BY</conpostcode>
   <contelephone>01865 79073</contelephone>
   <conmobile></conmobile>
   <fax></fax>
   <conemail>stewards@oxfordfolkfestival.com</conemail>
  </contact>
 </festival>
</member>

这是我的架构

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 <xs:simpleType name="postcode">
  <xs:restriction base="xs:string">
   <xs:minLength value="6"/>
   <xs:maxLength value="8"/>
  </xs:restriction>
 </xs:simpleType>

 <xs:simpleType name="telephone">
  <xs:restriction base="xs:string">
   <xs:minLength value="10"/>
   <xs:maxLength value="13"/>
  </xs:restriction>
 </xs:simpleType>

 <xs:simpleType name="mobile">
  <xs:restriction base="xs:string">
   <xs:minLength value="11"/>
   <xs:maxLength value="11"/>
  </xs:restriction>
 </xs:simpleType>

 <xs:simpleType name="password">
  <xs:restriction base="xs:string">
   <xs:minLength value="32"/>
   <xs:maxLength value="32"/>
  </xs:restriction>
 </xs:simpleType>

 <xs:simpleType name="userlevel">
  <xs:restriction base="xs:integer">
   <xs:enumeration value="1"/>
   <xs:enumeration value="2"/>
   <xs:enumeration value="3"/>
   <xs:enumeration value="4"/>
  </xs:restriction>
 </xs:simpleType>

 <xs:simpleType name="county">
  <xs:restriction base="xs:string">
   <xs:enumeration value="Bedfordshire"/>
   <xs:enumeration value="Berkshire"/>
   <xs:enumeration value="Bristol"/>
   <xs:enumeration value="Buckinghamshire"/>
   <xs:enumeration value="Cambridgeshire"/>
   <xs:enumeration value="Cheshire"/>
   <xs:enumeration value="Cleveland"/>
   <xs:enumeration value="Cornwall"/>
   <xs:enumeration value="Cumberland"/>
   <xs:enumeration value="Derbyshire"/>
   <xs:enumeration value="Devon"/>
   <xs:enumeration value="Dorset"/>
   <xs:enumeration value="Durham"/>
   <xs:enumeration value="East Ridings Of Yorkshire"/>
   <xs:enumeration value="Essex"/>
   <xs:enumeration value="Gloucestershire"/>
   <xs:enumeration value="Hampshire"/>
   <xs:enumeration value="Herefordshire"/>
   <xs:enumeration value="Hertfordshire"/>
   <xs:enumeration value="Huntingdonshire"/>
   <xs:enumeration value="Isle Of Man"/>
   <xs:enumeration value="Kent"/>
   <xs:enumeration value="Lancashire"/>
   <xs:enumeration value="Leicestershire"/>
   <xs:enumeration value="Lincolnshire"/>
   <xs:enumeration value="London"/>
   <xs:enumeration value="Middlesex"/>
   <xs:enumeration value="Norfolk"/>
   <xs:enumeration value="North Yorkshire"/>
   <xs:enumeration value="Northamptonshire"/>
   <xs:enumeration value="Northumberland"/>
   <xs:enumeration value="Nottinghamshire"/>
   <xs:enumeration value="Oxfordshire"/>
   <xs:enumeration value="Rutland"/>
   <xs:enumeration value="Shropshire"/>
   <xs:enumeration value="Somerset"/>
   <xs:enumeration value="South Yorkshire"/>
   <xs:enumeration value="Staffordshire"/>
   <xs:enumeration value="Suffolk"/>
   <xs:enumeration value="Surrey"/>
   <xs:enumeration value="Sussex"/>
   <xs:enumeration value="Tyne and Wear"/>
   <xs:enumeration value="Warwickshire"/>
   <xs:enumeration value="West Yorkshire"/>
   <xs:enumeration value="Westmorland"/>
   <xs:enumeration value="Wiltshire"/>
   <xs:enumeration value="Wirral"/>
   <xs:enumeration value="Worcestershire"/>
   <xs:enumeration value="Yorkshire"/>
  </xs:restriction>
 </xs:simpleType> 

 <xs:element name="folktask">
  <xs:complexType>
   <xs:sequence>
    <xs:element minOccurs="0" maxOccurs="unbounded" ref="member"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="member">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="user" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element ref="festival" minOccurs="0" maxOccurs="unbounded"/>  
   </xs:sequence>
  </xs:complexType>
 </xs:element>

 <xs:element name="user">
   <xs:complexType>
  <xs:attribute name="id" type="xs:integer"/>
    <xs:sequence>
   <xs:element ref="personal"/>
   <xs:element ref="account"/> 
    </xs:sequence>
   </xs:complexType>
 </xs:element>

 <xs:element name="personal">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="name"/>
    <xs:element ref="sex"/>
    <xs:element ref="address1"/>
    <xs:element ref="address2"/>
    <xs:element ref="city"/>
    <xs:element ref="county"/>
    <xs:element ref="postcode"/>
    <xs:element ref="telephone"/>
    <xs:element ref="mobile"/>
    <xs:element ref="email"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="name" type="xs:string"/>
 <xs:element name="sex" type="xs:string"/>
 <xs:element name="address1" type="xs:string"/>
 <xs:element name="address2" type="xs:string"/>
 <xs:element name="city" type="xs:string"/>
 <xs:element name="county" type="xs:string"/>
 <xs:element name="postcode" type="postcode"/>
 <xs:element name="telephone" type="telephone"/>
 <xs:element name="mobile" type="mobile"/>
 <xs:element name="email" type="xs:string"/>
 <xs:element name="account">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="username"/>
    <xs:element ref="password"/>
    <xs:element ref="userlevel"/>
    <xs:element ref="signupdate"/> 
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="username" type="xs:string"/>
 <xs:element name="password" type="password"/>
 <xs:element name="userlevel" type="userlevel"/>
 <xs:element name="signupdate" type="xs:dateTime"/>

 <xs:element name="festival">
   <xs:complexType>
  <xs:attribute name="id" type="xs:integer" user="optional"/>
   <xs:sequence>
    <xs:element ref="event"/>
    <xs:element ref="contact"/> 
  </xs:sequence>
   </xs:complexType>
 </xs:element>

 <xs:element name="event">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="eventname"/> 
    <xs:element ref="url"/>
    <xs:element ref="datefrom"/>
    <xs:element ref="dateto"/>
    <xs:element ref="location"/>
    <xs:element ref="eventpostcode"/>
    <xs:element ref="coords"/> 
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="eventname" type="xs:string"/>
 <xs:element name="url" type="xs:string"/>
 <xs:element name="datefrom" type="xs:date"/>
 <xs:element name="dateto" type="xs:date"/>
 <xs:element name="location" type="xs:string"/>
 <xs:element name="eventpostcode" type="postcode"/>
 <xs:element name="coords">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="lat"/>
    <xs:element ref="lng"/> 
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="lat" type="xs:decimal"/>
 <xs:element name="lng" type="xs:decimal"/>
 <xs:element name="contact">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="conname"/>
    <xs:element ref="conaddress1"/>
    <xs:element ref="conaddress2"/>
    <xs:element ref="concity"/> 
    <xs:element ref="concounty"/>
    <xs:element ref="conpostcode"/> 
    <xs:element ref="contelephone"/>
    <xs:element ref="conmobile"/> 
    <xs:element ref="fax"/>
    <xs:element ref="conemail"/>  
   </xs:sequence>
  </xs:complexType>
 </xs:element>
 <xs:element name="conname" type="xs:string"/>
 <xs:element name="conaddress1" type="xs:string"/>
 <xs:element name="conaddress2" type="xs:string"/>
 <xs:element name="concity" type="xs:string"/>
 <xs:element name="concounty" type="xs:string"/>
 <xs:element name="conpostcode" type="postcode"/>
 <xs:element name="contelephone" type="telephone"/>
 <xs:element name="conmobile" type="mobile"/>
 <xs:element name="fax" type="telephone"/>
 <xs:element name="conemail" type="xs:string"/>
</xs:schema>

1 个答案:

答案 0 :(得分:3)

这是一个有效的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:simpleType name="postcode">
        <xs:restriction base="xs:string">
            <xs:minLength value="6"/>
            <xs:maxLength value="8"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="telephone">
        <xs:restriction base="xs:string">
            <xs:minLength value="10"/>
            <xs:maxLength value="13"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="mobile">
        <xs:restriction base="xs:string">
            <xs:minLength value="11"/>
            <xs:maxLength value="11"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="password">
        <xs:restriction base="xs:string">
            <xs:minLength value="32"/>
            <xs:maxLength value="32"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="userlevel">
        <xs:restriction base="xs:integer">
            <xs:enumeration value="1"/>
            <xs:enumeration value="2"/>
            <xs:enumeration value="3"/>
            <xs:enumeration value="4"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="county">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Bedfordshire"/>
            <xs:enumeration value="Berkshire"/>
            <xs:enumeration value="Bristol"/>
            <xs:enumeration value="Buckinghamshire"/>
            <xs:enumeration value="Cambridgeshire"/>
            <xs:enumeration value="Cheshire"/>
            <xs:enumeration value="Cleveland"/>
            <xs:enumeration value="Cornwall"/>
            <xs:enumeration value="Cumberland"/>
            <xs:enumeration value="Derbyshire"/>
            <xs:enumeration value="Devon"/>
            <xs:enumeration value="Dorset"/>
            <xs:enumeration value="Durham"/>
            <xs:enumeration value="East Ridings Of Yorkshire"/>
            <xs:enumeration value="Essex"/>
            <xs:enumeration value="Gloucestershire"/>
            <xs:enumeration value="Hampshire"/>
            <xs:enumeration value="Herefordshire"/>
            <xs:enumeration value="Hertfordshire"/>
            <xs:enumeration value="Huntingdonshire"/>
            <xs:enumeration value="Isle Of Man"/>
            <xs:enumeration value="Kent"/>
            <xs:enumeration value="Lancashire"/>
            <xs:enumeration value="Leicestershire"/>
            <xs:enumeration value="Lincolnshire"/>
            <xs:enumeration value="London"/>
            <xs:enumeration value="Middlesex"/>
            <xs:enumeration value="Norfolk"/>
            <xs:enumeration value="North Yorkshire"/>
            <xs:enumeration value="Northamptonshire"/>
            <xs:enumeration value="Northumberland"/>
            <xs:enumeration value="Nottinghamshire"/>
            <xs:enumeration value="Oxfordshire"/>
            <xs:enumeration value="Rutland"/>
            <xs:enumeration value="Shropshire"/>
            <xs:enumeration value="Somerset"/>
            <xs:enumeration value="South Yorkshire"/>
            <xs:enumeration value="Staffordshire"/>
            <xs:enumeration value="Suffolk"/>
            <xs:enumeration value="Surrey"/>
            <xs:enumeration value="Sussex"/>
            <xs:enumeration value="Tyne and Wear"/>
            <xs:enumeration value="Warwickshire"/>
            <xs:enumeration value="West Yorkshire"/>
            <xs:enumeration value="Westmorland"/>
            <xs:enumeration value="Wiltshire"/>
            <xs:enumeration value="Wirral"/>
            <xs:enumeration value="Worcestershire"/>
            <xs:enumeration value="Yorkshire"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:element name="folktask">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="member"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="member">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="user" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="festival" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="user">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="personal"/>
                <xs:element ref="account"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:integer"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="personal">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="sex"/>
                <xs:element ref="address1"/>
                <xs:element ref="address2"/>
                <xs:element ref="city"/>
                <xs:element ref="county"/>
                <xs:element ref="postcode"/>
                <xs:element ref="telephone"/>
                <xs:element ref="mobile"/>
                <xs:element ref="email"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="sex" type="xs:string"/>
    <xs:element name="address1" type="xs:string"/>
    <xs:element name="address2" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="county" type="xs:string"/>
    <xs:element name="postcode" type="postcode"/>
    <xs:element name="telephone" type="telephone"/>
    <xs:element name="mobile" type="mobile"/>
    <xs:element name="email" type="xs:string"/>
    <xs:element name="account">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="username"/>
                <xs:element ref="password"/>
                <xs:element ref="userlevel"/>
                <xs:element ref="signupdate"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="username" type="xs:string"/>
    <xs:element name="password" type="password"/>
    <xs:element name="userlevel" type="userlevel"/>
    <xs:element name="signupdate" type="xs:dateTime"/>
    <xs:element name="festival">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="event"/>
                <xs:element ref="contact"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:integer" use="optional"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="event">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="eventname"/>
                <xs:element ref="url"/>
                <xs:element ref="datefrom"/>
                <xs:element ref="dateto"/>
                <xs:element ref="location"/>
                <xs:element ref="eventpostcode"/>
                <xs:element ref="coords"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="eventname" type="xs:string"/>
    <xs:element name="url" type="xs:string"/>
    <xs:element name="datefrom" type="xs:date"/>
    <xs:element name="dateto" type="xs:date"/>
    <xs:element name="location" type="xs:string"/>
    <xs:element name="eventpostcode" type="postcode"/>
    <xs:element name="coords">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="lat"/>
                <xs:element ref="lng"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="lat" type="xs:decimal"/>
    <xs:element name="lng" type="xs:decimal"/>
    <xs:element name="contact">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="conname"/>
                <xs:element ref="conaddress1"/>
                <xs:element ref="conaddress2"/>
                <xs:element ref="concity"/>
                <xs:element ref="concounty"/>
                <xs:element ref="conpostcode"/>
                <xs:element ref="contelephone"/>
                <xs:element ref="conmobile"/>
                <xs:element ref="fax"/>
                <xs:element ref="conemail"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="conname" type="xs:string"/>
    <xs:element name="conaddress1" type="xs:string"/>
    <xs:element name="conaddress2" type="xs:string"/>
    <xs:element name="concity" type="xs:string"/>
    <xs:element name="concounty" type="xs:string"/>
    <xs:element name="conpostcode" type="postcode"/>
    <xs:element name="contelephone" type="telephone"/>
    <xs:element name="conmobile" type="mobile"/>
    <xs:element name="fax" type="telephone"/>
    <xs:element name="conemail" type="xs:string"/>
</xs:schema>

说明:

<sequence>标记错位

您还有一个拼写错误,您在其中编写了用户而不是用作<attribute>代码的属性