Validation XML avec XSD: Comment éviter de se soucier de la séquence des éléments?
J'ai le code xsd suivant:
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
Le problème ici est: l'emplacement des éléments, multipleChoiceInput, etc. doivent apparaître dans le même ordre qu'ils sont déclarés. Je ne veux pas que cela se produise, je veux que, dans le processus de validation, la séquence ne devrait pas être pertinente. Comment puis-je y parvenir?
Une autre possibilité que j'ai essayé a été:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
Dans cet exemple, la séquence n'a vraiment plus d'importance, et je peux avoir autant d'éléments que je veux (ce que "tout" ne ferait pas permettez-moi de le faire). Mais j'ai toujours le Problème avec le min - et maxOccurs. Dans cet exemple, je pourrais avoir autant de "pictureInput" que possible, ce qui est contre la contrainte que je voudrais avoir 0 ou 1.
Merci beaucoup pour votre aide!
3 réponses
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:all>
</xsd:complexType>
NOTE: j'ai changé "séquence" à "tous"
La séquence force l'ordre (tel que défini). si l'ordre n'a pas d'importance, tout est utilisé.
S'il y a des chances d'occurrence d'élément plus d'une fois alors xsd:any peut être utilisé.
<xsd:complexType name="questions">
<xsd:sequence>
<xsd:any minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
Vous pouvez trouver les détails de xsd:tout au lien suivant:
Je suis un peu en retard à cette discussion, mais j'ai eu le même problème et j'ai trouvé la solution:
<xsd:complexType name="questions">
<xsd:choice maxOccurs="unbounded">
<xsd:element name="location" type="location"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/>
<xsd:element name="textInput" type="textInput"/>
<xsd:element name="pictureInput" type="pictureInput"/>
</xsd:choice>
</xsd:complexType>
La clé est de combiner xs: choice avec maxOccurs= "unbounded". Si vous utilisez simplement xs: all, Vous êtes autorisé un de chaque, point.
Édité pour ajouter: Alors que xs: any fonctionnera, il ne limitera pas vos choix aux quatre éléments détaillés. Cela permettra n'importe quoi, ce qui va à peu près à l'encontre du but d'un schéma.
Aussi très tard à la fête ici, mais l'utilisation de <xsd:all>
en conjonction avec minOccurs
et maxOccurs
ne fonctionnerait-elle pas?:
<xsd:complexType name="questions">
<xsd:all>
<xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/>
<xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/>
<xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>