2014-06-23 10 views
5

Jestem mylić o sekwencji schematu XML Według w3schools.com,
The sequence element specifies that the child elementsmust appearin a sequence. Each child element can occur from0to any number of times.
Jeśli każdy element musi pojawić się, w jaki sposób może nastąpić 0 razy? Czy to nie złamałoby reguły, która musi być wyświetlana jako ?xsd - sekwencja vs wyboru


I kolejna rzecz, jaka jest różnica między

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

i tak:

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

nie można umieścić dowolną liczbę każdego elementu dla obu tych przypadkach? Czy jest jakaś różnica?

Odpowiedz

9

Elementy w sekwencji muszą być wyświetlane w kolejności określonej w schemacie. Ale jeśli element jest zdefiniowany za pomocą minOccurs = "0", to nie musi się pojawiać.

Oto przykład, który jest jednym z samouczka w3schools.com. Właśnie dodałem minOccurs = "0" do elementu imienia.

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

W tym przypadku elementy prawidłowy XML oparte na tej definicji byłoby

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

lub usunąć element firstname ponieważ ma minOccurs = "0"

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

nie można jednak wymieszaj kolejność elementów. Więc byłoby to nieważne.

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

Co do różnicy między wyborem a sekwencją. Element wyboru pozwala tylko na pojawienie się jednego z elementów. Tak więc wybór mógłby mieć wybór A lub wybór B, ale nie oba. Podczas gdy sekwencja jest zdefiniowana, każdy element sekwencji będzie miał zarówno wybór A, jak i wybórB.

+1

Dzięki, to było bardzo pomocne. Jeśli jednak ustawisz maxOccur = "unbounded" dla wyboru, czy nie możesz mieć tylu elementów, ile chcesz? –

+0

Z wyborem jak zdefiniowano: nadal możesz wybrać tylko A lub B, ale możesz mieć tyle wybranych elementów, ile chcesz. –

2

Niestety istnieje inny sposób użycia opcji wyboru - w przypadku od 0 do nieograniczonego możliwe jest posiadanie wielu elementów tego samego typu, a także żadnego.

przykład:

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

akceptuje następujące xml jeden:

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

i zaakceptuje dwa następujące XML:

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