11
votes

Schéma XML - Définir les éléments enfants 0- * dans n'importe quel ordre

Je veux définir un schéma XML où les connecteurs d'éléments ont 0- * éléments enfants. Séquence, association ou message dans n'importe quel ordre et 0 à plusieurs reprises. I.e.

<xs:element name="Connectors">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Association" minOccurs="0" maxOccurs="unbounded" />
            <xs:element ref="Message" minOccurs="0" maxOccurs="unbounded" />
            <xs:element ref="Sequence" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>


0 commentaires

5 Réponses :


0
votes

Malheureusement, il n'y a pas de moyen pratique dans le schéma XML de définir "cet ensemble d'éléments enfants dans n'importe quel ordre, mais chacun se produit au moins une fois".

Vous êtes coincé avec une commande définie, soit l'un d'un ensemble (éventuellement répété).

EDIT: NO PRATIQUE , générer manuellement toutes les séquences possibles est possible et fonctionnerait, mais l'explosion combinatoire va rapidement sortir de la main.


3 commentaires

Consultez mon autre réponse sur la manière dont cela est en fait possible, mais pas de manière pratiquement mise en œuvre sur des ensembles d'éléments plus importants.


@Jasso: déclarant manuellement toutes les séquences possibles ... intéressante :-)


Oui, d'une manière c'est comme marcher de Floride à New York. Si vous avez vraiment besoin de, vous pouvez le faire. Mais sérieusement ... il est tout simplement plus facile d'utiliser une autre façon de voyager (ou dans ce cas, une autre langue pour définir un schéma) ;-);



30
votes

Je l'ai résolu en réglant à choix fort> et régler les attributs de minococcurs et de maxousceurs.

<xs:element name="Connectors">
    <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="Association" />
            <xs:element ref="Message" />
            <xs:element ref="Sequence" />
        </xs:choice>
    </xs:complexType>
</xs:element>


1 commentaires

Réponse claire et logique (+1). Bien que j'ai ajouté une réponse à moi-même, je préfère réellement le vôtre. Ma réponse n'est ici que pour montrer que seul un autre attribut aurait fait votre code d'origine pour faire ce que vous vouliez.



8
votes

@ la réponse propre de Torbjörn est plus clair que celui-ci, mais seulement un petit changement de votre tentative initiale aurait abouti au même résultat: ajouter maxocurs = "illimité" code> sur le code> élément.

<xs:element name="Connectors">
    <xs:complexType>
        <xs:sequence maxOccurs="unbounded">
            <xs:element minOccurs="0" name="Association" />
            <xs:element minOccurs="0" name="Message" />
            <xs:element minOccurs="0" name="Sequence" />
        </xs:sequence>
    </xs:complexType>
</xs:element>


0 commentaires

4
votes

(Ce n'est pas une réponse exactement à l'OP, mais une réponse à une autre réponse suggérée à la question de l'OP. En tant que nouveau meme, je ne suis pas sûr que cela casse des règles ou des conventions ici sur Stackoverflow.com. Désolé. )

L'utilisateur @Richard a écrit dans sa réponse: P>

Malheureusement, le schéma XML n'est pas un moyen de définir "cet ensemble d'éléments enfants dans n'importe quel ordre, mais chacun se produit au moins une fois". P>

Vous êtes coincé avec une commande définie, soit l'un d'un ensemble (éventuellement répété). P> blockQquote>

Il est correct qu'il n'y a pas de balises ou d'attributs qui permettent particulièrement de telles structures, mais le texte cité est théoriquement non em> vrai, bien que la solution devienne rapidement énorme comme la quantité d'éléments grandit. Écrire un schéma pour une telle structure avec plusieurs éléments est laborieux, sujet aux erreurs et difficile à maintenir. Donc, même si une solution existe, la mise en œuvre pratiquement n'est pas possible ou la peine. P>

Question d'affiches originales a eu un ensemble de trois éléments survenants aléatoires. La solution correcte était simple, car aucun des éléments n'était obligatoire. Mais même dans ce type de cas, avec un tel ensemble d'éléments, forçant chaque des éléments à apparaître au moins une fois est encore modérément facile à mettre en œuvre. Exemple de code ci-dessous P>

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Schema for 3 elements with random order.
        Each element must appear at least once. -->

    <xs:element name="Association" type="xs:string"/>
    <xs:element name="Message" type="xs:string"/>
    <xs:element name="Sequence" type="xs:string"/>

    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="Connectors" type="unordered-3-group" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="unordered-3-group">
    <!-- state level 0 -->
        <xs:group ref="Connectors-state-0"/>
    </xs:complexType>

    <xs:group name="Connectors-state-0">
        <xs:sequence>
            <!-- Empty, no previous elements
            <xs:choice minOccurs="0" maxOccurs="unbounded">
            </xs:choice> -->
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="Association"/>
                    <xs:group ref="Connectors-state-1a"/>
                </xs:sequence>
                <xs:sequence>
                    <xs:element ref="Message"/>
                    <xs:group ref="Connectors-state-1b"/>
                </xs:sequence>
                <xs:sequence>
                    <xs:element ref="Sequence"/>
                    <xs:group ref="Connectors-state-1c"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:group name="Connectors-state-1a">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Association"/>
            </xs:choice>
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="Message" />
                    <xs:group ref="Connectors-state-2a"/>
                </xs:sequence>
                <xs:sequence>
                    <xs:element ref="Sequence" />
                    <xs:group ref="Connectors-state-2b"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:group name="Connectors-state-1b">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Message"/>
            </xs:choice>
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="Association" />
                    <xs:group ref="Connectors-state-2a"/>
                </xs:sequence>
                <xs:sequence>
                    <xs:element ref="Sequence" />
                    <xs:group ref="Connectors-state-2c"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:group name="Connectors-state-1c">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Sequence"/>
            </xs:choice>
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="Association" />
                    <xs:group ref="Connectors-state-2b"/>
                </xs:sequence>
                <xs:sequence>
                    <xs:element ref="Message" />
                    <xs:group ref="Connectors-state-2c"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:group name="Connectors-state-2a">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Association"/>
                <xs:element ref="Message"/>
            </xs:choice>
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="Sequence" />
                    <xs:group ref="Connectors-state-3a"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:group name="Connectors-state-2b">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Association"/>
                <xs:element ref="Sequence"/>
            </xs:choice>
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="Message" />
                    <xs:group ref="Connectors-state-3a"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:group name="Connectors-state-2c">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Message"/>
                <xs:element ref="Sequence"/>
            </xs:choice>
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="Association" />
                    <xs:group ref="Connectors-state-3a"/>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:group>

    <xs:group name="Connectors-state-3a">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Association"/>
                <xs:element ref="Message"/>
                <xs:element ref="Sequence"/>
            </xs:choice>
            <!-- Empty, no new elements
            <xs:choice>
                <xs:sequence>
                </xs:sequence>
            </xs:choice> -->
        </xs:sequence>
    </xs:group>

</xs:schema>


0 commentaires

1
votes

C'est un très vieux fil, mais au cas où cela pourrait aider quiconque ici est ce que j'ai fait pour résoudre le problème. Utilisez le XSD: tous et définissez les minocs = "0" sur tout enfant qui peut être omis: xxx


0 commentaires