2014-06-23 12 views
5

Ich bin verwirrt über die XML-Schema-Sequenz Nach w3schools.com,
The sequence element specifies that the child elementsmust appearin a sequence. Each child element can occur from0to any number of times.
Wenn jedes Element muss erscheinen, wie kann es vorkommen, 0 mal? Würde das nicht brechen muss erscheinen Regel?xsd - Sequenz vs Wahl


Und noch etwas, was ist der Unterschied zwischen

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

und diese:

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

können Sie nicht für beide Fälle eine beliebige Anzahl von jedem Element setzen? Gibt es überhaupt einen Unterschied?

Antwort

9

Die Elemente innerhalb einer Sequenz müssen in der im Schema angegebenen Reihenfolge angezeigt werden. Wenn ein Element jedoch mit minOccurs = "0" definiert ist, muss es nicht angezeigt werden.

Hier ist ein ähnliches Beispiel zu einem, das eine der w3schools.com Tutorial ist. Ich habe gerade das minOccurs = "0" zum firstname Element hinzugefügt.

<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 diesem Fall gültige XML-Elemente auf der Grundlage dieser Definition

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

oder Sie entfernen das Vorname Element sein würde, weil es sich um eine minOccurs = "0"

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

hat kann man nicht mische jedoch die Reihenfolge der Elemente. Das wäre also ungültig.

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

Wie für den Unterschied zwischen der Wahl und der Reihenfolge. Mit dem Auswahlelement kann nur eines der Elemente angezeigt werden. Die Auswahl könnte also entweder eine Auswahl oder eine Auswahl haben, aber nicht beides. Während die Reihenfolge der Sequenz definiert ist, wird jedes Sequenzelement sowohl eine AuswahlA und eine AuswahlB haben.

+1

Dank, das war sehr hilfreich. Wenn Sie jedoch maxOccur = "unbounded" für eine Auswahl festlegen, können Sie nicht so viele Elemente haben, wie Sie möchten. –

+0

Mit der Auswahl wie definiert: Sie können immer nur entweder Choice oder ChoiceB haben, aber Sie können so viele Elemente haben, wie Sie möchten. –

2

Leider gibt es einen anderen Weg, um Wahl zu verwenden - im Falle von 0 bis unbegrenzt ist es möglich, mehrere Elemente des gleichen Typs sowie keine zu haben.

Beispiel:

<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> 

akzeptiert XML folgende:

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

und wird folgende XML zwei akzeptieren:

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