2009-03-14 4 views
0

Ich habe ein Problem bei der Erstellung einer xsd Datei. Ich brauche eine xsd Datei für xml Dokumente haben, die wie folgt aussehen:Wie kann ich in XSD zwei verschiedene Elemente mit demselben Namen definieren?

<message type="login"> 
    <login nick="Ben" gameId="chess" desiredRole="simple "/> 
</message> 

oder ähnliche

<message type="error"> 
    Error message 
</message> 

Bedeutung gibt es immer ein message Tag, aber es hat verschiedene Attribut type Werte und je nach Typ Wert gibt es verschiedene Dinge innerhalb der message Tag. Ich habe versucht, so etwas wie diese:

<xsd:element name ='message' type='messageType'> 
</xsd:element> 

<xsd:complexType name='messageType'/> 
    <xsd:complexType name='error'> 
    <xsd:complexContent> 
     <xsd:extension base='messageType'> 
     <xsd:attribute name ='type' use='required'> 
      <xsd:simpleType> 
      <xsd:restriction base='xsd:string'> 
       <xsd:enumeration value='error'/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:attribute> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 

    <xsd:complexType name='login'> 
    <xsd:complexContent> 
     <xsd:extension base='messageType'> 
     <xsd:sequence> 
      <xsd:element name='login'> 
      <xsd:complexType> 
       <xsd:attribute name='nick' type='xsd:string' use='required'> 
       </xsd:attribute> 
       <xsd:attribute name='gameId' type='xsd:string' use='required'> 
       </xsd:attribute> 
       <xsd:attribute name='desiredRole' type='xsd:string' use='required'> 
       </xsd:attribute> 
      </xsd:complexType> 
      </xsd:element> 
     </xsd:sequence> 
     <xsd:attribute name ='type' use='required'> 
      <xsd:simpleType> 
      <xsd:restriction base='xsd:string'> 
       <xsd:enumeration value='login'/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:attribute> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 

</xsd:schema> 

, aber es funktioniert nicht (ich eine Fehlermeldung erhalten, dass der Attributtyp nicht definiert wurde). Kann mir bitte jemand helfen? innerhalb der Nachricht

Antwort

2

Wie wäre es

<message> 
    <login /> 
</message> 

und

<message> 
    <error /> 
</message> 

Das heißt, das type-Attribut weglassen, und immer ein Element haben.

1

XSD ermöglicht es Ihnen nicht, genau das zu tun, was Sie tun möchten. Dabei wird ein Element erstellt, das je nach Attributwerten unterschiedliche Strukturen aufweist. Wenn Sie jedoch wirklich benötigen, dass dieses Element verschiedene Strukturen wie diese hat, können Sie eine Elementdefinition erstellen, die alle möglichen Strukturen zulässt. Sie können es nicht automatisch vom Parser validieren lassen, um zu beweisen, dass es ausschließlich der einen oder der anderen Definition entspricht. Nicht unbedingt in XSD.

versuchen, etwas wie folgt aus:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="message" type="messageType"/> 

    <xsd:simpleType name="typeType"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:enumeration value="login"/> 
     <xsd:enumeration value="error"/> 
    </xsd:restriction> 
    </xsd:simpleType> 

    <xsd:element name="login"> 
    <xsd:complexType> 
     <xsd:attribute name='nick'  type='xsd:string' use='required'/> 
     <xsd:attribute name='gameId'  type='xsd:string' use='required'/> 
     <xsd:attribute name='desiredRole' type='xsd:string' use='required'/> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name='messageType'/> 
    <xsd:sequence> 
     <xsd:element ref="login" minOccurs="0" maxOccurs="1"/> 
    </xsd:sequence> 
    <xsd:attribute name="type" type="typeType" use="required"/> 
    </xsd:complexType> 
</xsd:schema> 
Verwandte Themen