significato - xml schema esempio




XSD-come consentire gli elementi in qualsiasi ordine un numero qualsiasi di volte? (4)

Sto cercando di creare un XSD e sto provando a scrivere la definizione con il seguente requisito:

  • Consenti all'elemento figlio specificato di apparire un numero qualsiasi di volte (da 0 a illimitato)
  • Consenti agli elementi secondari di essere in qualsiasi ordine

Mi sono guardato intorno e ho trovato varie soluzioni come this :

  <xs:element name="foo">
  <xsl:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="child1" type="xs:int"/>
      <xs:element name="child2" type="xs:string"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

Ma da quello che capisco xs: la scelta consente solo la selezione di un singolo elemento. Quindi, impostare MaxOccurs su illimitato come questo dovrebbe significare solo che "nessuno" degli elementi figlio può apparire più volte. È accurato?

Se la soluzione di cui sopra non è corretta, come posso ottenere ciò che ho dichiarato sopra nel mio requisito?

EDIT : Cosa succede se il requisito è il seguente?

  • Elemento child1 child2 può apparire un numero qualsiasi di volte (da 0 a illimitato)
  • Elementi per essere in qualsiasi ordine
  • Gli elementi child3 e child4 dovrebbero apparire esattamente una volta.

Ad esempio, questo xml è valido:

<foo>
<child1> value </child1>
<child1> value </child1>
<child3> value </child3>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

ma questo non lo è (bambino mancante3)

<foo>
<child1> value </child1>
<child1> value </child1>
<child2> value </child2>
<child4> value </child4>
<child1> value </child1>
</foo>

Ma da quello che capisco xs: la scelta consente solo la selezione di un singolo elemento. Quindi, impostare MaxOccurs su illimitato come questo dovrebbe significare solo che "nessuno" degli elementi figlio può apparire più volte. È accurato?

No. La scelta avviene individualmente per ogni "ripetizione" di xs:choice che si verifica a causa di maxOccurs="unbounded" . Pertanto, il codice che hai pubblicato è corretto e in realtà farà ciò che vuoi come scritto.


Dovresti trovare che il seguente schema consente ciò che hai proposto.

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

Questo ti permetterà di creare un file come:

<?xml version="1.0" encoding="utf-8" ?>
<foo>
  <child1>2</child1>
  <child1>3</child1>
  <child2>test</child2>
  <child2>another-test</child2>
</foo>

Che sembra corrispondere alla tua domanda.


Nello schema che hai nella tua domanda, child1 o child2 possono apparire in qualsiasi ordine, qualsiasi numero di volte. Quindi questo sembra quello che stai cercando.

Modifica: se si desidera che una sola di esse compaia un numero illimitato di volte, l'illimitato dovrebbe invece andare sugli elementi:

Modifica: risolto il tipo in XML.

Modifica: maiuscola O in maxOccurs

<xs:element name="foo">
   <xs:complexType>
     <xs:choice maxOccurs="unbounded">
       <xs:element name="child1" type="xs:int" maxOccurs="unbounded"/>
       <xs:element name="child2" type="xs:string" maxOccurs="unbounded"/>
     </xs:choice>
   </xs:complexType>
</xs:element>

Questo è quello che alla fine ha funzionato per me:

<xsd:element name="bar">
  <xsd:complexType>
    <xsd:sequence>
      <!--  Permit any of these tags in any order in any number     -->
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="child1" type="xsd:string" />
        <xsd:element name="child2" type="xsd:string" />
        <xsd:element name="child3" type="xsd:string" />
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>