2014-06-23 5 views
5

Sono confuso su XML Schema sequenza di Secondo w3schools.com,
The sequence element specifies that the child elementsmust appearin a sequence. Each child element can occur from0to any number of times.
Se deve apparire ogni elemento, come può accadere 0 volte? Non si interromperà la regola deve apparire?XSD - sequenza vs scelta


E un'altra cosa, qual è la differenza tra

<xs:choice minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="choiceA" type="xs:string" > 
    <xs:element name="choiceB" type="xs:string" /> 
</xs:choice> 

e questo:

<xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="choiceA" type="xs:string" > 
    <xs:element name="choiceB" type="xs:string" /> 
</xs:sequence> 

non si può mettere un qualsiasi numero di ogni elemento per entrambi questi casi? C'è qualche differenza?

risposta

9

Gli elementi all'interno di una sequenza devono apparire nell'ordine specificato nello schema. Ma se un elemento è definito con minOccurs = "0", allora non deve apparire.

Ecco un esempio simile a quello del tutorial di w3schools.com. Ho appena aggiunto minOccurs = "0" all'elemento firstname.

<xs:element name="employee"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="firstname" type="xs:string" minOccurs="0"/> 
     <xs:element name="lastname" type="xs:string"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

In questo caso gli elementi validi XML basati su questa definizione sarebbe

<employee> 
    <firstname>John</firstname> 
    <lastname>Smith</lastname> 
</employee> 

oppure rimuovere l'elemento cognome perché ha un minOccurs = "0"

<employee> 
    <lastname>Smith</lastname> 
</employee> 

non si può comunque mischia l'ordine degli elementi. Quindi questo non sarebbe valido.

<employee> 
    <lastname>Smith</lastname> 
    <firstname>John</firstname> 
</employee> 

Per quanto riguarda la differenza tra la scelta e la sequenza. L'elemento choice consente solo a uno degli elementi di apparire. Quindi la scelta potrebbe avere la sceltaA o la sceltaB, ma non entrambe. Mentre il modo in cui viene definita la sequenza ogni elemento di sequenza avrà sia una sceltaA sia una sceltaB.

+1

Grazie, questo è stato molto utile. Tuttavia, se imposti maxOccur = "illimitato" per una scelta, non potresti avere il numero di ogni elemento che desideri? –

+0

Con la scelta così come definita: si può ancora avere solo la sceltaA o la sceltaB, ma si può avere il maggior numero di elementi scelti che si desidera. –

2

sfortunatamente c'è un altro modo di usare la scelta - in caso di 0 a illimitato è possibile avere più elementi dello stesso tipo e nessuno.

esempio:

<xs:element name="module"> 
    <xs:complexType> 
     <xs:choice maxOccurs="unbounded" minOccurs="0"> 
     <xs:element ref="active"/> 
     <xs:element ref="debug"/> 
     <xs:element name="name"> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 

accetterà seguente codice XML uno:

<samba> 
    <active>off</active> 
    <name>Box</name> 
</samba> 

e accetterà seguente codice XML due:

<samba> 
    <debug>off</debug> 
    <active>off</active> 
    <debug>off</debug> 
    <name>Box</name> 
    <debug>off</debug> 
</samba>