Comment définir plusieurs éléments avec le même nom, mais un type différent dans l'élément xsd: choice?
Est-il possible, d'une certaine façon, de définir un schéma xsd qui a pu valider une telle xml:
<item_list>
<item ItemType="SimpleMessage" Caption="Simplest message"/>
<item ItemType="ComplexMessage" SomeAttr="value">
<item_data>some text</item_data>
</item>
</item_list>
Problème est que je havn'trouverez pas de possibilité de définir qch comme:
<xsd:element name="Items">
<xsd:complexType>
<xsd:choice>
<xsd:element name="item" type="SimpleMessType"/>
<xsd:element name="item" type="ComplexMessType"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
Mais j'ai besoin de vérifier, que SimpleMessage n'a pas d'enfant des éléments supplémentaires ou attrs 🙁
source d'informationauteur Nikolay Ponomarenko
Vous devez vous connecter pour publier un commentaire.
Comme les réponses précédentes ont déjà mentionné, vous pouvez le faire assez facilement dans XSD 1.0 en utilisant le
xsi:type
attribut au lieu de définir un nouveauItemType
attribut avec les mêmes fonctionnalités.XSD 1.1 comprend une construction conçue pour faciliter la prise en charge des cas comme celui-ci, pour les personnes qui, pour quelque raison que ce soit ne souhaitez pas utiliser
xsi:type
de cette façon: conditionnel type d'affectation. Essentiellement, il permet à une déclaration d'élément d'avoir simple séquence de XPath /typename paires; les expressions XPath sont évaluées dans l'ordre et quand on évalue à true, l'élément est associé avec le type correspondant. Il y a des restrictions sur les requêtes Xpath pour interdire à la recherche de l'avant dans l'élément de descendants ou à la recherche vers le haut ou vers d'autres parties du document XML (la première aide à garder-il possible de connaître, dès qu'un scan rencontre une balise de début, le type à utiliser pour la validation d'un élément; la seconde permet de garder la validation libre de tout contexte), donc, essentiellement, les tests ne peuvent être des tests sur les valeurs des attributs. Votre exemple peut être écrite ainsi:La troisième alternative, assure que l'un de vos cas attendus doivent être rencontrées, pour l'élément pour être valide. S'il a été omis ici, alors si ni le test d'expressions ont été vrai, l'élément qui serait attribué le type déclaré de
item
dans ce casxs:anyType
.XSD expressément interdit un tel cas. Vous devez modifier les noms d'élément unique (ou utilisez xsi:type comme xcut dit, ce qui revient à la même chose).
Pour contourner ce problème, vous pouvez fusionner les définitions de type de SimpleMessType et ComplexMessType dans un seul type avec mixed="true" -- et puis démêler le contenu que vous recevez dans votre propre code d'après le Schéma de traitement est terminé. Voir la stackoverflow discussion sur Schéma XSD pour récursive XML.
Vous ne pouvez pas faire cela en utilisant le schéma de structure que vous avez proposée, parce que la structure viole le Schéma XML de l'ambiguïté des règles.
Une autre option pour vous est de définir un super-type, dire
BaseElement
qui est vide, et puis des sous-types, et l'utilisationxsi:type
pour remplacer au lieu de juste un type normaltype
attribut. Plus d'informations sur comment cela fonctionne peuvent être trouvés ici.