4 votes

Comment déclarer un cas spécial de schéma XML (XSD)

J'ai besoin de votre aide pour définir un cas particulier dans le schéma XML : Une séquence qui contient deux éléments : 'x' et 'y' alors que :

  • <x> L'élément peut apparaître de 0 à un nombre illimité de fois dans la séquence.

  • <y> L'élément peut apparaître 0 à 1 fois dans la séquence.

  • <x> y <y> Les emplacements peuvent être n'importe où - c'est-à-dire qu'il est possible d'avoir des temps non liés le <x> et ensuite un seul élément <y> et ensuite délié fois l'élément <x> élément.

Exemples XML de ce problème :

Exemple 1

<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Exemple n° 2

<y>stuff</y>
<x>stuff</x>
<x>stuff</x>

Exemple n° 3

<x>stuff</x> 
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

Merci !

5voto

Alohci Points 30645

Pour diverses raisons, aucun des échantillons de Yuval, Mo ou davidsheldon ne fonctionne. En voici un qui fonctionne.

    <xs:complexType name="myComplexType">
    <xs:sequence>
        <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        <xs:sequence minOccurs="0">
            <xs:element name="y" type="xs:string"/>
            <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:sequence>
    </xs:complexType>

2voto

Mo. Points 6747

EDIT : Comme Alohci l'a mentionné, ma solution est incorrecte. Selon la spécification, un élément dans xs:all ne peut apparaître que zéro ou une seule fois. Désolé pour la gêne occasionnée

Je pense que ce que vous voulez n'est pas une séquence. Une séquence définit non seulement les éléments mais aussi l'ordre. Et dans votre cas, l'ordre peut changer. Avez-vous essayé xs:all ?

<xs:complexType name="myComplexType">
  <xs:all>
    <xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="y" type="xs:string" maxOccurs="1"/>
  </xs:all>
</xs:complexType>

Une autre approche pourrait être d'en faire une séquence, mais de marquer la séquence comme étant maxOccurs="unbounded"

0voto

Yuval Adam Points 59423

Pas trop compliqué. De mémoire, ça devrait être quelque chose comme ça :

<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 

Étant donné que chaque élément d'un XSD est facultatif par défaut, ce XSD correspondra à la structure XML que vous avez définie, avec l'attribut y apparaissant n'importe où avant, après ou entre l'élément x éléments, avec une occurrence maximale de 1

0voto

davidsheldon Points 2287

Cela fait un moment que je n'ai pas utilisé de schéma, mais je pense que les séquences sont votre réponse ici.

Vous devez disposer d'un nombre illimité de choix entre (un x), ou (un y suivi d'un x).

<xsd:element name="parent">
  <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="x" type="xs:string"/>
      <xsd:sequence>
        <xsd:element name="y" type="xsd:string" />
        <xsd:element name="x" type="xsd:string" />
      </xsd:sequence>
    </xsd:choice>
  </xsd:complexType>  
</xsd:element>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X