2010-07-24 4 views
30

J'ai le code XSD suivant:Validation XML avec XSD: comment éviter de se soucier de la séquence des éléments?

<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. doit apparaître dans le même ordre dans lequel ils sont déclarés. Je ne veux pas que cela arrive, 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é 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 pas d'importance plus, et je peux avoir tant d'éléments que je veux (ce « tout » ne permettrait pas moi 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, quelle est la contrainte que je voudrais avoir soit 0 ou 1.

Merci beaucoup d'avoir aidé!

Répondre

39
<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" pour "tous"

forces de l'ordre de séquence (tel que défini). si l'ordre n'a pas d'importance alors 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 trouverez tous les détails de xsd: tout au lien suivant:

http://www.w3schools.com/schema/schema_complex_any.asp

+2

Merci d'avoir répondu à Yok, mais « tous » ne peut pas être utilisé dans mon cas, la cause "all" nécessite que l'élément apparaisse seulement une fois (min- et maxOccurs ne peuvent accepter que les valeurs 0 et 1). – jcborges

+1

Ensuite, peut-être '' est votre ami. – Tomalak

+1

Ya dans ce cas, tout doit être utilisé. Mettra également à jour la réponse. – YoK

16

Je suis un peu en retard à cette discussion, mais j'ai eu le même problème et 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 avez droit à un de chaque, point.

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

+1

Pour moi, c'est la meilleure approche pour un tel problème mais ce n'est pas parfait. Dans ce cas, cela ne respecte pas l'exigence d'avoir 0 ou 1 "pictureInput". Vous pouvez ajouter plus de 1 et le paramétrage de maxOccurs ne peut pas empêcher cela (car le choix lui-même n'est pas lié). –

0

également très tard à la fête, mais serait en utilisant <xsd:all> conjointement avec minOccurs et maxOccurs 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

Non, car à l'intérieur de vous ne pouvez pas définir maxOccurs supérieure à 1 – sotix

Questions connexes