web-dev-qa-db-fra.com

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 soit pas pertinente. Comment puis-je atteindre cet objectif?

Une autre possibilité que j'ai essayée 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 plus vraiment d'importance, et je peux avoir autant d'éléments que je veux (ce que "tout" ne me permettrait pas de faire). Mais j'ai toujours le problème avec les min- et maxOccurs. Dans cet exemple, je pourrais avoir autant de "pictureInput" que possible, ce qui est contre la contrainte que je voudrais avoir soit 0 soit 1.

Merci beaucoup pour votre aide!

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

REMARQUE: j'ai changé "séquence" en "tous"

La séquence force l'ordre (tel que défini). si l'ordre n'a pas d'importance alors tout est utilisé.

S'il y a des chances d'apparition d'éléments 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: any sur le lien suivant:

https://www.w3schools.com/xml/schema_complex_any.asp

48
YoK

Je suis un peu en retard dans 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 = "illimité". Si vous utilisez simplement xs: all, vous avez droit à un de chaque point.

modifié pour ajouter: Alors que xs: any fonctionnera, il ne limitera pas vos choix aux quatre éléments détaillés. Il permettra n'importe quoi, ce qui va à peu près à l'encontre de l'objectif d'un schéma.

19
CD Jorgensen

Aussi très tard pour la fête ici, mais utiliserait <xsd:all> en conjonction avec minOccurs et maxOccurs ne fonctionne 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>
1
gaelicyoda