2012-09-19 8 views
5

L'elemento doveva avere un tipo di 'una lista di stringhe' e può esserci 0 o più occorrenze di quel tipo di informazioni. Quindi quello che ho fatto è stato:Schema XML: un elenco di stringhe

<xs:element name="xxx" type="ooo" /> 

<xs:simpleType name="ooo"> 
    <xs:list itemType="xs:string" /> 
</xs:simpleType> 

Credo che questo è corretto, ma

Dove metto minOccur e maxOccur qui?

+1

cosa intendi con "elenco di stringhe"? Vuoi occorrenze da 0 a x dell'elemento "xxx"? O vuoi un singolo elemento "xxx" che abbia una singola stringa delimitata che puoi analizzare? O vuoi un singolo elemento "xxx" che abbia da 0 a x elementi figlio (effettivamente il tuo elenco) – psubsee2003

+0

psubsee2003 se non ti dispiace potresti darmi gli esempi di ogni possibile interpretazione possibile? –

risposta

23

La tua domanda è purtroppo chiara perché potrebbe significare più cose.

Una possibile interpretazione è che si desidera che un elemento "xxx" si verifichi tra 0 e x volte. Questo viene fatto definendo una sequenza all'interno di un elemento radice.

<xs:simpleType name="ooo"> 
    <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:element name="root"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="xxx" type="ooo" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Non è possibile specificare minOccurs e maxOccurs sull'elemento radice anche se, come ci può essere solo 1 elemento root in un XML. Ma puoi definire una sequenza come un bambino per l'elemento radice, che questo è ciò che viene fatto nell'esempio sopra.

Ora, se si desidera che "xxx" sia l'elemento principale, è possibile fare esattamente la stessa cosa esatta. questo è esattamente la stessa tranne che invece di un elemento chiamato "root" Ora avete un elemento chiamato "xxx" e gli elementi figlio sono chiamati qualcos'altro con un tipo di "ooo"

<xs:simpleType name="ooo"> 
    <xs:restriction base="xs:string" /> 
</xs:simpleType> 

<xs:element name="xxx"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="xxx-child" type="ooo" maxOccurs="unbounded" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Nel tuo esempio, la l'uso del tipo "lista" significa ciò che penso tu pensi che significhi. Un tipo di elenco in un XSD non definisce una sequenza di elementi, ma un singolo elemento che può avere un elenco di valori delimitati da uno spazio.

<xs:simpleType name="ooo"> 
    <xs:list itemType="xs:string" /> 
</xs:simpleType> 

<xs:element name="xxx" type="ooo" /> 

L'XML risultante da questo schema defination sarebbe simile a questa:

<xxx>item1 item2 item3 item4 item5</xxx> 

L'XML è effettivamente un elenco illimitato di stringhe di qualsiasi lunghezza separati da uno spazio. È possibile definire un tipo per l'elenco che eredita da xs:string per limitare i tipi di valori, ma non sono a conoscenza di un metodo per limitare la lunghezza.

Infine, quello che penso che stai cercando di realizzare è vicino a uno dei miei suggerimenti sopra con "xxx" e "xxx-child", ma semplicemente riformattando il punto in cui è definita la sequenza.

<xs:complexType name="ooo"> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="child" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:element name="xxx" type="ooo" /> 

E l'XML risultante desidera un

<?xml version="1.0" encoding="utf-8"?> 
<xxx> 
    <child></child> 
    <child></child> 
    <child></child> 
</xxx> 

e ci sono altre variazioni sul ultima opzione, come lo spostamento del minOccurs="0" maxOccurs="unbounded" dal <xs:sequence> all'elemento "bambino". Nel tuo esempio non avrà importanza perché entrambe le definizioni darebbero lo stesso esatto XML.Ma se tu avessi 2 elementi figlio, vorrebbe dire cose diverse:

<xs:complexType name="ooo"> 
    <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
    <xs:element name="child1" type="xs:string" /> 
    <xs:element name="child2" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

si tradurrebbe in un XML come questo (la sequenza di follow child1 da child2 si sarebbe ripetuto x volte):

<?xml version="1.0" encoding="utf-8"?> 
<xxx> 
    <child1></child1> 
    <child2></child2> 
    <child1></child1> 
    <child2></child2> 
    <child1></child1> 
    <child2></child2> 
</xxx> 

dove come

<xs:complexType name="ooo"> 
    <xs:sequence> 
    <xs:element name="child1" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
    <xs:element name="child2" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:complexType> 

comporterebbe un XML simili (child1 ripeteva x volte, seguito da child2 ripetitive tempo y):

<?xml version="1.0" encoding="utf-8"?> 
<xxx> 
    <child1></child1> 
    <child1></child1> 
    <child2></child2> 
    <child2></child2> 
    <child2></child2> 
    <child2></child2> 
    <child2></child2> 
</xxx> 
+0

questa risposta è estremamente precisa e risponde esattamente alla mia domanda. Grazie mille per la tua risposta dettagliata. –

-1

Ecco un esempio di codice che ho trovato che possono aiutare:

<xs:element name="person"> 
<xs:complexType> 
     <xs:sequence> 
      <xs:element name="full_name" type="xs:string"/> 
      <xs:element name="child_name" type="xs:string" 
      maxOccurs="10" minOccurs="0"/> 
     </xs:sequence> 
</xs:complexType> 
</xs:element>