Question

Je dois créer un schéma pour un format XML déjà utilisé. Le programme XML existant est déjà généré par un programme différent, et il semble difficile de retrouver tous les emplacements à modifier pour pouvoir utiliser un format XML plus standard.

Voici un exemple similaire à notre structure XML:

<data>
    <summary>some info</summary>
    <error>error message (only if there was an error)</error>
    <details>more info
        <x>more</x>
        <y>even more</y>
    </details>
    <error>another error message</error>
    <z>some extra info</z>
</data>

Notez que la balise d'erreur est réutilisée au même niveau et vient après certains éléments mais pas d'autres, aussi je ne peux pas définir simplement maxOccurs = "illimité". J'ai essayé d'encapsuler les paires d'erreur / autres balises associées dans une séquence xsd:, mais cela ne fait pas l'affaire, car je ne respecte toujours pas la règle d'attribution de particule unique.

Cela peut-il même être fait ou dois-je informer les autres développeurs que ce schéma ne sera pas validé?

Était-ce utile?

La solution

La lecture du norme de schéma XML indique que vous êtes probablement en sécurité. Vous venez de définir des éléments non consécutifs avec le même nom dans votre schéma, pour refléter le XML tel qu'il sera (ou pourra être) généré. Tant que toutes les " erreurs " les instances sont toujours séparées par d'autres éléments et non consécutives, cela ne devrait pas poser de problème. Par exemple, quelque chose comme:

  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="error" type="xs:string"/>

  <xs:complexType name="detailsType">
    ....
  </xs:complexType>

Si details a minOccurs = " 0 " et le premier " erreur " ci-dessus a un maxOccurs > 1, vous échouez à la règle d'attribution de particules uniques, car la validation ne peut pas vérifier si vous avez deux éléments d'erreur dans une ligne, quelle instance de "erreur". dans le schéma auquel ils appartiennent. Cependant, tant que chaque instance de " erreur " peut être identifié de manière unique dans le schéma, grâce à l'utilisation judicieuse de "minOccurs". et " maxOccurs " pour les éléments d'erreur et pour les éléments d'intervention, alors vous êtes bon.

Vous pouvez même avoir des instances consécutives de " erreur " tant que le validateur de schéma peut toujours déterminer sans ambiguïté à quelle instance il est fait référence en utilisant minOccurs et maxOccurs (par exemple).

Pensez au xhtml, dans lequel les éléments peuvent apparaître dans n'importe quel ordre, avec une répétition arbitraire.

EDIT: mis à jour pour refléter les modifications de la question d'origine.

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