Question

J'ai un document XML avec (essentiellement) ressemble à ceci:

...
<param>
    <key>age</key>
    <value>10</value>
</param>
<param>
    <key>smart</key>
    <value>true</value>
</param>
...

Je voudrais limiter les valeurs disponibles en fonction de la clé de paramètres, par exemple âge doit être un entier dans [0, 150] et à puce doit être vraie ou fausse.

Maintenant, si le XML était différent (par exemple comme dans l'exemple ci-dessous), il serait très simple:

...
<age>10</age>
<smart>true</smart>
...

Cependant, la structure XML ne changera pas à ce moment et je ne suis pas sûr qu'il le devrait. Est-il possible de mettre en œuvre ce genre de contraintes avec la structure XML en cours et si oui, comment?

Mise à jour:

A en juger par la (absence totale de) commentaires, je dirais qu'il est probable que ce n'est pas possible en utilisant XSD. confirmer que quelqu'un peut?

Était-ce utile?

La solution

On dirait que vous pratiquement besoin d'une définition qui ressemble à quelque chose comme ceci:

  <!-- This is an INVALID example -->
  <xs:element name="param">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="age" />
          <xs:element name="value" type="xs:decimal" />
        </xs:sequence>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="smart" />
          <xs:element name="value" type="xs:boolean" />
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>

Malheureusement, cette partie des résultats de code dans le fichier non valide XML Schema .

Bien que la syntaxe est correcte, la sémantique viole les règles de schéma. Éléments avec le même nom et dans la même portée doivent avoir le même type. Dans ce cas, en particulier signifie que tous les éléments de <value> qui sont les enfants d'éléments de <param> doivent avoir même type.

Formellement c'est Schéma composant Contrainte: Élément Déclarations Conformément . Voir aussi la contrainte des composants de schéma suivant; vous pouvez généralement pas faire un type d'élément dépendant des autres valeurs dans le document ou sur toute information sur les éléments dans le reste de la séquence.

Mise à jour

J'ai complètement oublié cela, mais vous devriez être en mesure d'obtenir les contraintes que vous voulez si vous spécifiez le type désiré dans le document d'instance au lieu de définir uniquement dans le schéma. Cela peut se faire en ajoutant l'attribut xsi:type aux éléments <value>.

Exemple

<param>
    <key>age</key>
    <value xsi:type="xs:decimal">10</value>
</param>
<param>
    <key>smart</key>
    <value xsi:type="xs:boolean">true</value>
</param>

Bien sûr, cela est un peu gênant, car il faut changer le processus de génération XML. En outre, il ne fournit pas automatiquement aucune garantie que <key> et le xsi:type défini sont une paire correspondant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top