2016-11-11 1 views
1

Ich habe ein Attribut namens Classroom in ein Element namens Lecture eingefügt. Hier ist das XML-Schema:Warum erlaubt meine XSD ein verbotenes Attribut in meinem XML?

<xsd:attribute name="Classroom" use="required"> 
<xsd:simpleType> 
    <xsd:restriction base="xsd:string"> 
     <xsd:minLength value="0"/> 
     <xsd:maxLength value="7"/> 
    </xsd:restriction> 
</xsd:simpleType> 

. 
. 
. 
<xsd:complexType name="labType"> 
     <xsd:complexContent> 
      <xsd:restriction base="eventType"> 
       <xsd:sequence> 
        <xsd:element name="Title" type="xsd:string"/> 
        <xsd:element name="Lecture" maxOccurs="10" minOccurs="1"/> 
       </xsd:sequence> 
         <xsd:attribute name="Clasroom" use="prohibited"/> 
       </xsd:restriction> 
     </xsd:complexContent> 
    </xsd:complexType> 
. 
. 
. 
<xsd:element name="Lab" substitutionGroup="Event" type="labType"/> 

Das Problem, das ich habe, ist, dass dieses Schema nicht die Beschränkung auf das Attribut gilt. Ich habe versucht, diesen XML-Code zu bestätigen:

<Lab> 
       <Title>Artificial Intelligence</Title> 
       <Lecture Classroom="BA">  
        <Day>Friday</Day> 
        <Time>17:00-18:00</Time> 
       </Lecture>     
    </Lab> 

Mein Problem ist, dass diese XML als gültig gemeldet wird, obwohl es das Attribut „Klassenzimmer“ verwendet (was sie nicht tun sollen, können). Ich bin neu in XML, also bitte nicht hart sein. Vielen Dank im Voraus!

Antwort

1

Ihre Erklärung Lecture,

<xsd:element name="Lecture" maxOccurs="10" minOccurs="1"/> 

für Lecture keine Art erklärt, so dass Sie damit effektiv alle Inhalte und alle Attribute auf Lecture, unabhängig von irgendwelchen Einschränkungen Sie irgendwo anders definiert haben könnte auf Classroom in der XSD.

ist die komplette XSD, die Ihre XML erfolgreich validieren:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Lab"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Title" type="xs:string"/> 
     <xs:element name="Lecture"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Day" type="xs:string"/> 
       <xs:element name="Time" type="xs:string"/> 
      </xs:sequence> 
      <xs:attribute name="Classroom"> 
       <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:minLength value="0"/> 
        <xs:maxLength value="7"/> 
       </xs:restriction> 
       </xs:simpleType>    
      </xs:attribute> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Die obige XSD das Classroom Attribut auf Lecture können aber Werte beschränken Strings der Länge zwischen 0 und 7, einschließend zu sein.

Sie könnten auch xs:attribute/use="prohibited" hinzufügen zu verhindern @Classroom auf Lecture erscheinen, aber Ihren ursprünglichen Titel, und dieser Teil Ihrer Frage,

Das Problem, das ich habe, ist, mit, dass dieses Schema nicht die gilt Einschränkung für das Attribut

Implizieren Sie, dass der Fokus Ihrer Frage darauf liegt, warum die Einschränkung keinen Effekt hatte. Vielleicht meintest du irgendeine Einschränkung im generischen Sinne - xs:restriction oder use="prohibit". Nun, die Antwort ist dieselbe: Indem Sie Lecture keinen Typ zugewiesen haben, haben Sie zugelassen, dass er von jedem Typ ist und irgendwelche Attribute hat.

2

Typo in Clasroom (nur 1 's')

<xsd:attribute name="Clasroom" use="prohibited"/> 

Der andere Teil des Problems besteht darin, dass das Attribut Einschränkung eher auf das Lab Element angelegt wird als das Lecture Element.

+0

Guter Fang auf 'verboten' (+1). Der ursprüngliche Titel erwähnte "Beschränkung", aber Sie könnten Recht haben, dass OP sich wunderte, warum die Beschränkung auf das Attribut im generischen Sinne, einschließlich "verwenden =" verboten "", keine Auswirkungen auf das XML hatte. Die Hauptursache, behaupte ich, war das Versäumnis, einen Typ für "Vortrag" anzugeben. – kjhughes