Je suis désolé que vous avez travaillé avec ce problème depuis 7 ans maintenant avec aucune réponse. Je vais vous aider en revoyant vos hypothèses. En traitant "Nom" comme un élément de données qui doit être prioritaire, et en exigeant qu'il soit un enfant d'Application, puis en disant généralement que vous ne vous souciez pas de l'ordre de ses frères et soeurs, vous êtes faire une situation confuse pour vous. Pourquoi Name est-il un frère de ADD et DELETE s'il suit des règles différentes et sert un but différent? Si vous deviez modéliser ceci dans n'importe quelle autre structure de données, vous n'incluriez pas "Name" dans une liste de choses à côté de "ADD" et "DELETE". Vous diriez deux choses: Une application a un nom, et il a également une liste de commandes telles que ADD et DELETE.
Étant donné que Name est une chose spéciale par rapport à ADD et DELETE, il doit être modélisé séparément de ces autres balises. Ainsi, vous pouvez faire de Name un attribut d'Application et conserver Add et Delete en tant qu'éléments enfants, ou vous pouvez conserver Name en tant qu'élément enfant, puis entourer ADD et DELETE avec une balise de placeholder/grouping, telle que Commands . La balise Commands serait le seul frère de Name.
Voici un schéma prenant en charge le nom en tant qu'attribut, avec un nombre arbitraire de commandes dans n'importe quel ordre. "Nom comme Attribute.xsd":
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application" type="Application_Type" />
<xs:complexType name="Application_Type">
<xs:all>
<xs:element minOccurs="0" ref="ADD"/>
<xs:element minOccurs="0" ref="DELETE"/>
<xs:element minOccurs="0" ref="THIRD"/>
<xs:element minOccurs="0" ref="FOURTH"/>
</xs:all>
<xs:attribute name="Name"/>
</xs:complexType>
<xs:element name="ADD"/>
<xs:element name="DELETE"/>
<xs:element name="THIRD"/>
<xs:element name="FOURTH"/>
</xs:schema>
Exemple XML:
<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="text" xsi:noNamespaceSchemaLocation="Name as Attribute.xsd">
<THIRD>text</THIRD>
<ADD>text</ADD>
<FOURTH>text</FOURTH>
<DELETE>text</DELETE>
</Application>
Et voici une avec les commandes imbriquées dans une balise d'espace réservé. "Commandes Grouping.xsd":
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Application" type="Application_Type"/>
<xs:complexType name="Application_Type">
<xs:sequence>
<xs:element ref="Name"/>
<xs:element name="Commands" type="Commands_Type"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Commands_Type">
<xs:all>
<xs:element minOccurs="0" ref="ADD"/>
<xs:element minOccurs="0" ref="DELETE"/>
<xs:element minOccurs="0" ref="THIRD"/>
<xs:element minOccurs="0" ref="FOURTH"/>
</xs:all>
</xs:complexType>
<xs:element name="Name"/>
<xs:element name="ADD"/>
<xs:element name="DELETE"/>
<xs:element name="THIRD"/>
<xs:element name="FOURTH"/>
</xs:schema>
Exemple XML:
<?xml version="1.0" encoding="UTF-8"?>
<Application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Commands Grouping.xsd">
<Name>text</Name>
<Commands>
<THIRD>text</THIRD>
<ADD>text</ADD>
<FOURTH>text</FOURTH>
<DELETE>text</DELETE>
</Commands>
</Application>
Une note sur l'un de ces messages est que zéro avec les commandes sont toujours message valide. Peut-être que c'est correct, mais si c'est un problème, peut-être que cette validation appartient à la couche Application plutôt qu'à la XSD.
Merci beaucoup pour votre réponse. J'ai bien réglé ma question ci-dessus. Je voulais dire que ADD et DELETE ne devraient pas apparaître 0 ou 1 fois, mais leur ordre n'est pas important. "all" ne peut pas être utilisé dans ce cas, car l'élément obligatoire NAME ne peut pas être associé à "all". Avez-vous une autre solution? Merci – ogee
Cela fonctionne uniquement avec l'attribut maxOccurs = "unbounded" pour la balise de choix – Pooya